我正在尝试为我的应用实现搜索功能。我有一条明确的路线来获取传入的搜索字词。
以下是我的路由器文件的全部内容:
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;
这一切都很好,花花公子。它基本上只是在命中'./server/assets/items.json'
的发布请求路由时打印出服务器上'/api/search'
的内容。我的问题是在我的路由器文件中使用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();
,但new ListDataProvider() {
@Override protected List getData() {
if (noFilter) return emptyList
else return database.getList(filter)
}
}
内的打印正确记录了文件的内容。我认为这是我遇到JS的一些范围问题,但我不知道如何向自己解释,所以我想我在这里问它为什么它是单向工作,而不是另一种方式。
答案 0 :(得分:2)
您应该使用回调:
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'});
}
});
});