2015-11-28 44 views
2

我正在尝试为我的应用实施搜索功能。我有一个快速路线来获取搜索条件。读取要在快速路径中使用的文件

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

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'的发布请求路由时在服务器上打印出'./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();中的打印正确记录了该文件的内容。我认为这是我遇到的一些范围问题,但我不知道如何向自己解释它,所以我想在这里问它为什么它以一种方式工作,而不是另一种方式。

+0

项目是异步设定因此其价值没有被设置为它印 – pwilmot

+0

你可以在时间使用承诺,并等待项目被设置,虽然 – pwilmot

+0

@pwilmot - 这是我的想法,但在我的路由器文件的第二版本,它打印在'console.log(JSON.parse(数据) );调用post函数中的'console.log(items);'之前。如果它已成功打印在readFile函数中,它不应该已经为post函数设置了它吗? – httpNick

回答

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