Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/423.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 读取要在快速路由中使用的文件_Javascript_Json_Node.js_Express_Scope - Fatal编程技术网

Javascript 读取要在快速路由中使用的文件

Javascript 读取要在快速路由中使用的文件,javascript,json,node.js,express,scope,Javascript,Json,Node.js,Express,Scope,我正在尝试为我的应用程序实现搜索功能。我有一条快速路线来获取输入的搜索词 以下是我的路由器文件的全部内容: var express = require('express'); var router = express.Router(); var bodyParser = require('body-parser'); var searchutil = require('../utils/searchhandler'); router.use( bodyParser.json() ); rout

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

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

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;
这是我的searchhandler文件,它包含在我的路由器中:

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'
的post请求路由时,它基本上只是在服务器上打印出
'./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时遇到的某种范围问题,但我不确定如何向自己解释,所以我想在这里问一下为什么它以一种方式工作,而不是另一种方式工作。

您应该使用回调:

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'});
     }
  });
});

项目是异步设置的,因此打印时不会设置其值。您可以使用承诺并等待项目设置though@pwilmot-这就是我的想法,但是在我的路由器文件的第二个版本中,它在
console.log(JSON.parse(data))上的readFile函数中打印它
控制台日志之前(项目)。如果在readFile函数中成功打印,是否应该为post函数设置它?