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

Javascript Node.js和Express:异步操作后如何返回响应,javascript,node.js,express,asynchronous,Javascript,Node.js,Express,Asynchronous,我是Node.js的新手,所以我仍然在思考异步函数和回调。我现在的难题是如何在异步操作中从文件读取数据后返回响应 我的理解是,发送响应的工作方式是这样的(这对我来说也适用): 但是,现在我想读取一个文件,对数据执行一些操作,然后在响应中返回结果。如果我想对数据执行的操作很简单,我可以这样做——内联执行它们,并保持对res对象的访问,因为它仍然在范围内 app.get('/search', function (req, res) { fs.readFile("data.txt", func

我是Node.js的新手,所以我仍然在思考异步函数和回调。我现在的难题是如何在异步操作中从文件读取数据后返回响应

我的理解是,发送响应的工作方式是这样的(这对我来说也适用):

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

app.get('/search', function (req, res) {
    fs.readFile("data.txt", function(err, data) {
        result = process(data.toString());
        res.send(result);
    });
});
但是,我需要执行的文件操作非常长且复杂,因此我已将它们分离到一个单独文件中各自的函数中。因此,我的代码看起来更像这样:

 app.get('/search', function (req, res) {
    searcher.do_search(res.query);
    // ??? Now what ???
});
我需要调用
res.send
以发送结果。但是,我不能在上面的函数中直接调用它,因为
do\u search
是异步完成的。我不能在
do_search
的回调中调用它,因为
res
对象不在那里的范围内


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

要在不同的函数中访问变量,当没有共享作用域时,将其作为参数传递

您只需传递
res
,然后对函数中的一个变量访问
query
send


为了分离关注点,最好传递回调

然后
do_search
只需要知道如何执行查询,然后运行函数。这使得它更通用(从而可重用)


我会说,要么将
res
对象作为参数传递到函数中,要么将其设置为可以将函数作为参数传递,然后在工作完成时调用它(即创建自己的回调)。后者可能会更好,因为它不会将您的代码与“API”进行耦合。传递回调肯定是一种方法+谢谢你的建议。谢谢你的帮助。我确实修改了我的do_search函数来接受回调,它工作得很好。这能回答问题吗?为什么示例中不包括所讨论的函数
app.get
。因为逐字复制一堆毫无疑问的代码是没有意义的;这只会让我们更难发现差异。
 app.get('/search', function (req, res) {
    searcher.do_search(res.query);
    // ??? Now what ???
});
searcher.do_search(res.query, function (data) {
    res.send(...);
});

function do_search(query, callback) {
    callback(...);
}