Nodejs如何让api调用异步读取文件

时间:2015-05-05 00:02:00

标签: node.js express

这是我的第一个nodejs项目,我仍然试图让异步调用挂起,所以请耐心等待。所以在我的路线中,我已经将'/ users / username'注册到一个函数,该函数将读取一个文件(理想情况下是一个数据库,但现在我正在从一个文件中读取)。现在我可以选择打电话 fs.readFileSync我想避免。如何将回调传递给fs.readFile,然后将响应发送回客户端?

代码:

var getData = function(key){
    try {
            fs.readFile(__dirname + '/users.json', function(err, tenantsJSON){
            var parsedConfig = JSON.parse(tenantsJSON.toString());
            if (!parsedConfig.hasOwnProperty(key)){
                throw {
                    name: key + "NotFound",
                    error: "key " + "does not exist.",
                    status: 404
                }
            }
            return parsedConfig[key] //How do I pass the response from here
        });

    } catch (e) {
        console.error(String.format("File {0} not found or is invalid: {1}",'config.json', e.message));
        throw {
            name: "Internal server error",
            error: "Internal server error",
            status: 500
        }
    }
}

在路线中:

router.get('/users/:username', auth, function(req, res, next) {

     ///How do I get the read file back here?? 
      var body = getData(req.params.username);
})

1 个答案:

答案 0 :(得分:1)

您可以通过将回调传递给getData()

来使其异步
var getData = function(key, callback) {

然后在readFile()中调用此回调:

fs.readFile(__dirname + '/users.json', function(err, tenantsJSON) {
    if (err) {
        return callback(err);
    }

    // ...
    callback(null, parsedConfig[key]);
});

然后在路由器中:

router.get('/users/:username', auth, function(req, res, next) {

    getData(req.params.username, function (err, body) {
         // ...
         next();
    });
});