节点.js和表达式:如何在异步操作后返回响应

Node.js and Express: How to return response after asynchronous operation

本文关键字:异步操作 返回 响应 js 表达式 节点      更新时间:2023-09-26

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

我的理解是发送响应的工作方式如下(这对我有用):

app.get('/search', function (req, res) {
    res.send("request received");
});

但是,现在我想读取一个文件,对数据执行一些操作,然后在响应中返回结果。如果我想对数据执行的操作很简单,我可以做这样的事情 - 内联执行它们,并保持对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_search异步完成的。而且我无法在对do_search的回调中调用它,因为res对象不在那里的范围内。

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

若要访问其他函数中的变量,当没有共享作用域时,请将其作为参数传递。

您可以只传递res,然后在函数中的一个变量上访问querysend


出于关注点分离的目的,最好改为传递回调。

然后do_search只需要知道执行查询然后运行函数。这使得它更通用(因此可重用)。

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

现有的答案是完全有效的,您也可以从 ES2017 开始使用 async/await 关键字。使用您自己的函数:

app.get('/search', async(req, res, next) {
  try {
    const answer = await searcher.do_search(req.query);
    res.send(answer);
  }
  catch(error) {
    return next(error);
  }
});