在我的程序中,我使 async
从另一个 API 模块调用我的函数:
var info = await api.MyRequest(value);
模块代码:
var request = require("request")
module.exports.MyRequest = async function MyRequest(value) {
var options = {
uri: "http://some_url",
method: "GET",
qs: { // Query string like ?key=value&...
key : value
},
json: true
}
try {
var result = await request(options);
return result;
} catch (err) {
console.error(err);
}
}
执行立即返回,但是 result
因此 info
包含请求对象和请求正文 - info.body
像 key=value& ...
,不需要响应正文。
我做错了什么?怎么修? request
与 async
的正确用法是什么,或者它只适用于此处提到的 Promise:Why await is not working for node request module ?以下文章提到这是可能的:Mastering Async Await in Node.js .
最佳答案
您需要使用 request-promise
模块,而不是 request
模块或 http.request()
。
await
适用于返回 promise 的函数,而不适用于返回 request
对象并期望您使用回调或事件监听器来知道事情何时完成的函数。
request-promise
模块支持与 request
模块相同的功能,但其中的异步函数返回 promise ,因此您可以使用 .then()
或 await
而不是 request
模块期望的回调。
所以,安装 request-promise
module然后改变这个:
var request = require("request");
到这里:
const request = require("request-promise");
那么,你可以这样做:
var result = await request(options);
2020 年 1 月编辑 - request() 模块处于维护模式
仅供引用,request
模块及其衍生模块(如 request-promise
)现在处于维护模式,不会积极开发以添加新功能。您可以阅读有关推理的更多信息 here . this table 中有一个替代列表对每一个进行一些讨论。
我一直在使用got()
我自己,它从一开始就使用 Promise 构建,支持许多与 request()
模块相同的选项,并且易于编程。
关于node.js - 在 Node.JS 中使用 async/await 正确请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45778474/