首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Node.js和Express:如何在异步操作后返回响应

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

Stack Overflow用户
提问于 2016-04-25 18:32:15
回答 2查看 20.6K关注 0票数 19

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

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

代码语言:javascript
运行
复制
app.get('/search', function (req, res) {
    res.send("request received");
});

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

代码语言:javascript
运行
复制
app.get('/search', function (req, res) {
    fs.readFile("data.txt", function(err, data) {
        result = process(data.toString());
        res.send(result);
    });
});

但是,我需要执行的文件操作既长又复杂,因此我将它们分离到一个单独文件中各自的函数中。因此,我的代码看起来更像这样:

代码语言:javascript
运行
复制
 app.get('/search', function (req, res) {
    searcher.do_search(res.query);
    // ??? Now what ???
});

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

谁能帮我理解一下在Node.js中处理这个问题的正确方法?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-25 18:34:30

要在没有共享作用域的情况下访问不同函数中的变量,请将其作为参数传递。

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

为了分离关注点,您可能更好地传递一个回调。

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

代码语言:javascript
运行
复制
searcher.do_search(res.query, function (data) {
    res.send(...);
});

function do_search(query, callback) {
    callback(...);
} 
票数 18
EN

Stack Overflow用户

发布于 2021-11-12 19:03:20

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

代码语言:javascript
运行
复制
app.get('/search', async(req, res, next) {
  try {
    const answer = await searcher.do_search(req.query);
    res.send(answer);
  }
  catch(error) {
    return next(error);
  }
});
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36838037

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档