一尘不染

在Node.JS中使用异步/等待正确请求

node.js

在我的程序中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&...,不需要响应体。

我做错了什么?怎么修?正确的request用法是什么async,或仅与此处提到的Promise一起正确使用:为什么await对于节点请求模块不起作用?以下文章提到了可能的方法:在Node.js中掌握Async
Await


阅读 311

收藏
2020-07-07

共1个答案

一尘不染

您需要使用request-promise模块,而不是request模块或http.request()

await对返回promise的函数起作用,而不对返回request对象并希望您使用回调或事件侦听器知道何时完成的函数起作用。

request- promise模块支持与该模块相同的功能request,但是其中的异步函数返回promise,因此您可以使用它们之一.then()await与其一起使用,而不是使用request模块期望的回调。

因此,安装request-promise模块,然后更改此设置:

var request = require("request");

对此:

const request = require("request-promise");

然后,您可以执行以下操作:

var result = await request(options);

编辑2020年1月-维护模式下的request()模块

仅供参考,该request模块及其派生类request- promise现在处于维护模式,不会积极开发以添加新功能。您可以在此处阅读更多有关推理的信息。有替代品的清单此表与每个人的一些讨论。

我一直在使用got()自己,它是从一开始就使用promise建立的,并且易于使用。

2020-07-07