node.js - 在 Node.JS 中使用 async/await 正确请求

标签 node.js rest asynchronous request async-await

在我的程序中,我使 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.bodykey=value& ...,不需要响应正文。

我做错了什么?怎么修? requestasync 的正确用法是什么,或者它只适用于此处提到的 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/

相关文章:

node.js - HAProxy + Nodejs + SockJS + Express + SSL

node.js - 需要构建的非缓存 npm 模块

node.js - 使用 JSON API Serializer 创建更复杂的 JSON

Django Rest Framework,POSTable 外部数据

rest - 一般来说,如果请求正文包含额外参数,那么使 REST 请求失败是一个好习惯吗?

javascript - Nodejs异步递归文件夹大小

asynchronous - Flutter 异步代码中错误的执行顺序

javascript - 如何使用 Regex 和 Chokidar 检测文件内容的更改

rest - Docker 容器中的 HTTP 请求因 HTTPS 端点而失败

java - 如何使用 Unirest 并行发送多个异步请求