【问题标题】:reading a file to use within an express route读取文件以在快速路线中使用
【发布时间】:2016-03-02 08:02:37
【问题描述】:

我正在尝试为我的应用实现搜索功能。我有一条快速路线来获取传入的搜索字词。

这是我的路由器文件的全部内容:

var express = require('express');
var router = express.Router();
var bodyParser = require('body-parser');
var searchutil = require('../utils/searchhandler');

router.use( bodyParser.json() );
router.use(bodyParser.urlencoded({
  extended: true
}));

router.post('/api/search', (req, res, next) => {
  var term = req.body.searchTerm;
  console.log(term);
  searchutil();
  res.json({test: 'post received'});
});

module.exports = router;

这是我的搜索处理程序文件,它包含在我的路由器中:

var fs = require('fs');

var findResults = function() {
  var items = fs.readFile('./server/assets/items.json', 'utf8', (err, data) =>{
    if (err) throw err;
    console.log(JSON.parse(data));
    return JSON.parse(data);
  });
}

module.exports = findResults;

这一切都很好,花花公子。当'/api/search' 的发布请求路由被命中时,它基本上只是在服务器上打印出'./server/assets/items.json' 的内容。我的问题是关于在我的路由器文件中使用 json 文件。假设我的路由器文件是:

var express = require('express');
var router = express.Router();
var bodyParser = require('body-parser');
var fs = require('fs');

var items = fs.readFile('./server/assets/items.json', 'utf8', (err, data) =>{
  if (err) throw err;
  console.log(JSON.parse(data));
  return JSON.parse(data);
});

router.use( bodyParser.json() );
router.use(bodyParser.urlencoded({
  extended: true
}));

router.post('/api/search', (req, res, next) => {
  var term = req.body.searchTerm;
  console.log(term);
  console.log(items);
  res.json({test: 'post received'});
});

module.exports = router;

所以现在我的路由器文件正在获取文件资产并尝试在我的router.post('/api/search', ...); 函数中将其打印出来。出现的问题是,当它尝试在该函数中打印它时items 似乎是undefined,但从fs.readFile(); 中的打印正确地记录了文件的内容。我认为这是我在使用 JS 时遇到的某种范围问题,但我不确定如何向自己解释,所以我想我会在这里问它为什么它以一种方式工作,而不是另一种工作方式。

【问题讨论】:

  • items 是异步设置的,因此在打印时不会设置其值
  • 你可以使用 promise 并等待设置项目
  • @pwilmot - 这就是我的想法,但在我的路由器文件的第二个版本中,它会在调用 post 函数中的 console.log(items); 之前在 console.log(JSON.parse(data)); 的 readFile 函数中打印它。如果它在 readFile 函数中成功打印,不应该已经为 post 函数设置了吗?

标签: javascript json node.js express scope


【解决方案1】:

你应该使用回调:

var getItems = function(cb) { 
  fs.readFile('./server/assets/items.json', 'utf8', (err, data) {
     if (err) cb({error: err});
     console.log(JSON.parse(data));
     cb({items: JSON.parse(data)});
  });
};

然后将路线改为:

router.post('/api/search', (req, res, next) => {
  var term = req.body.searchTerm;
  console.log(term);
  getItems(function (cb) {
     if (!cb.error) {
        console.log(cb.items);
        res.json({test: 'post received'});
     }
  });
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-22
    • 2013-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-22
    相关资源
    最近更新 更多