节点.js和表达式:如何在异步操作后返回响应
Node.js and Express: How to return response after asynchronous operation
我是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
,然后在函数中的一个变量上访问query
和send
。
出于关注点分离的目的,最好改为传递回调。
然后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);
}
});
相关文章:
- 无法在mvc视图中使用ajax调用获取操作返回的模型对象列表
- 如何指示“;熟度;在异步操作中
- 使用jquery更改异步操作中的文本值
- 从异步函数返回值
- 节点.js中的嵌套异步操作
- 阻止chrome.webRequest.onBeforeSendHeaders侦听器中的异步操作
- 在异步调用返回之前隐藏页面
- 节点.js和表达式:如何在异步操作后返回响应
- 从异步调用返回数组,然后为数组的每个元素返回其他异步调用
- Ember.js-定义一个全局函数,该函数可以向操作返回值
- 无法在Redux中测试异步操作
- 如何将异步方法返回的值发送到javascript中的另一个异步方法
- 当我在异步操作Redux上开始单元测试时,没有定义错误承诺
- 循环中的异步操作
- 回流如何侦听异步操作已完成
- 如何从Node.js中的异步循环返回
- AngularJS如何从异步调用返回值
- 什么'这是让函数返回等待异步操作完成的最佳方法
- 测试一个Node.js函数,该函数的返回值可以根据执行异步操作的时刻而改变
- 画布图像裁剪器 - canvas.toDataURL 异步操作,这是否返回任何类型的承诺