Node.js和Express:异步操作后如何返回响应

ekl*_*ekl 15 javascript asynchronous node.js express

我是Node.js的新手,所以我仍然围绕着异步函数和回调.我现在的奋斗是如何在异步操作中从文件读取数据后返回响应.

我的理解是发送响应就像这样(这对我有用):

app.get('/search', function (req, res) {
    res.send("request received");
});
Run Code Online (Sandbox Code Playgroud)

但是,现在我想读取一个文件,对数据执行一些操作,然后在响应中返回结果.如果我想对数据执行的操作很简单,我可以做这样的事情 - 内联执行它们,并保持对res对象的访问,因为它仍在范围内.

app.get('/search', function (req, res) {
    fs.readFile("data.txt", function(err, data) {
        result = process(data.toString());
        res.send(result);
    });
});
Run Code Online (Sandbox Code Playgroud)

但是,我需要执行的文件操作很长很复杂,我已经把它们分成了一个单独的文件中的自己的函数.结果,我的代码看起来更像这样:

 app.get('/search', function (req, res) {
    searcher.do_search(res.query);
    // ??? Now what ???
});
Run Code Online (Sandbox Code Playgroud)

我需要打电话res.send才能发送结果.但是,我无法在上面的函数中直接调用它,因为do_search异步完成.我不能在回调中调用它,do_search因为res对象不在那里.

有人可以帮我理解在Node.js中处理这个问题的正确方法吗?

Que*_*tin 17

要访问不同函数中的变量,如果没有共享范围,请将其作为参数传递.

你可以只通过res,然后同时访问querysend对功能中的一个变量.


出于分离关注点的目的,您可能最好不要传递回调.

然后do_search只需要知道执行查询然后运行一个函数.这使它更通用(因而可重复使用).

searcher.do_search(res.query, function (data) {
    res.send(...);
});

function do_search(query, callback) {
    callback(...);
} 
Run Code Online (Sandbox Code Playgroud)

  • 传递回调肯定是要走的路.建议+1. (2认同)