题 在Node.JS中使用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.body 喜欢 key=value&...,不要求回应机构。

我做错了什么?怎么修?什么是正确的 request 用法 async,或者它只适用于这里提到的承诺: 为什么await不适用于节点请求模块?以下文章提到有可能: 在Node.js中掌握Async Await


11
2017-08-20 04:33


起源


async 和 await 在nodejs 7最新版本中工作。所以请确保你有最新版本的nodejs 7.有关更多信息,请参阅此链接 blog.risingstack.com/async-await-node-js-7-nightly - Aabid
@Aabid我有Node.js 8.4 - Aleksey Kontsevich


答案:


你需要使用 request-promise 模块,而不是 request 模块。

await 适用于返回promise的函数,而不是返回函数的函数 request 对象并希望您使用回调或事件监听器来了解事情何时完成。

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

所以,安装 request-promise 模 然后改变这个:

var request = require("request");

对此:

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

22
2017-08-20 05:53





很确定你也可以做到以下几点。如果您需要的是默认情况下不返回Promise,您可以通过新的Promise方法提供它。上面的答案虽然不那么冗长。

async function getBody(url) {
  const options = {
    url: url,
    method: 'GET',
  };

  // Return new promise
  return new Promise(function(resolve, reject) {
    // Do async job
    request.get(options, function(err, resp, body) {
      if (err) {
        reject(err);
      } else {
        resolve(body);
      }
    })
  })
}


7
2018-01-30 21:10



这里异步的目的是什么,什么时候没有async关键字也可以正常工作?请原谅我这些问题。 - Sherwin Ablaña Dapito