读取文件以在快速路线中使用

我正在尝试为我的应用程序实现searchfunction。 我有一个快速路线来获取传入的search条件。

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

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; 

这里是我的search处理程序文件正在包括在我的路由器:

 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', ...);打印出来router.post('/api/search', ...); function。 发生的问题是,当它试图打印它在该函数items似乎是undefined ,但从fs.readFile();打印fs.readFile(); 正确logging文件的内容。 我认为这是我遇到的一些范围问题,但是我不知道如何向自己解释,所以我想在这里问一下它为什么是单向的,而不是另一个。

你应该使用callback:

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