读取文件以在快速路线中使用
我正在尝试为我的应用程序实现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'}); } }); });