Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.JS中使用async/await的正确请求_Node.js_Rest_Asynchronous_Request_Async Await - Fatal编程技术网

Node.JS中使用async/await的正确请求

Node.JS中使用async/await的正确请求,node.js,rest,asynchronous,request,async-await,Node.js,Rest,Asynchronous,Request,Async Await,在我的程序中,我从另一个API模块对我的函数进行async调用: 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",

在我的程序中,我从另一个API模块对我的函数进行
async
调用:

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&…
,而不是必需的响应正文


我做错了什么?如何修复?对于
async
,什么是正确的
request
用法,或者它只能在这里提到的承诺下正常工作:?下面的文章提到这是可能的:.

您需要使用
请求承诺
模块,而不是
请求
模块或
http.request()

await
适用于返回承诺的函数,而不适用于返回
请求
对象并希望您使用回调或事件侦听器来了解何时完成操作的函数

请求承诺
模块支持与
请求
模块相同的功能,但其中的异步函数返回承诺,因此您可以对它们使用
.then()
等待
,而不是
请求
模块期望的回调

因此,请安装,然后更改:

var request = require("request");
为此:

const request = require("request-promise");
然后,您可以执行以下操作:

var result = await request(options);

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

仅供参考,
request
模块及其衍生产品如
request promise
目前处于维护模式,不会积极开发以添加新功能。你可以阅读更多关于推理的内容。中有一个备选方案列表,并对每个备选方案进行了讨论


我一直在使用我自己,它从一开始就使用Promissions,支持许多与
request()
模块相同的选项,并且编程简单。

非常确定您也可以执行以下操作。如果您需要的东西在默认情况下没有返回承诺,您可以通过新的承诺方法提供它。不过,上面的答案没有那么冗长

异步函数getBody(url){ 常量选项={ url:url, 方法:“GET”, }; //回报新的承诺 返回新承诺(功能(解决、拒绝){ //执行异步作业 获取(选项、函数(err、resp、body){ 如果(错误){ 拒绝(错误); }否则{ 决议(机构); } }) })
}我刚刚设法让它与异步/await一起工作。我将它包装在一个函数
promisifiedRequest
中,以返回一个
promise
,该函数运行请求
回调
,并根据
错误
响应
解析或拒绝它

const request = require('request');

const promisifiedRequest = function(options) {
  return new Promise((resolve,reject) => {
    request(options, (error, response, body) => {
      if (response) {
        return resolve(response);
      }
      if (error) {
        return reject(error);
      }
    });
  });
};

(async function() {
  const options = {
    url: 'https://www.google.com',
    method: 'GET',
    gzip: true,
    headers: {
      'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.96 Safari/537.36'
    }
  };

  let response = await promisifiedRequest(options);

  console.log(response.headers);
  console.log(response.body);
})();

由于
request promise
已被弃用,以下是不依赖于NPM
request
包的其他选项
Get
已经提到,但它取决于其他11个包,相反,只有1个依赖项(用于重定向)。其他一切都是在本机NodeJS包之上本机实现和构建的

下面是使用axios的相同示例:

const axios=require('axios'))
const response=wait axios.get(url)
const result=response.data
打字机脚本中的一行:

const{data}=wait axios.get(url)

对于不需要Cookie、重定向和重试等高级功能的简单情况,您可以使用本机
http
/模块发出请求:

const https=require('https')
异步函数获取(url){
返回新承诺((解决、拒绝)=>{
const request=https.get(url,{timeout:1000},(res)=>{
如果(res.statusCode<200 | | res.statusCode>299){
返回拒绝(新错误(`HTTP状态代码${res.statusCode}`))
}
常量体=[]
res.on('data',(chunk)=>body.push(chunk))
res.on('结束',()=>{
const resString=Buffer.concat(body.toString)()
解析(Restring)
})
})
请求.on('error',(err)=>{
拒绝(错误)
})
请求时('超时',()=>{
请求销毁()
拒绝(新错误(“超时”)
})
})
}
const res=等待取数('https://...')

async
wait
在nodejs 7最新版本中工作。因此,请确保您拥有最新版本的NodeJS7。有关更多信息,请参阅此链接@Aabid I have Node.js 8.4当异步在没有async关键字的情况下也可以正常工作时,异步的用途是什么?请原谅我的这些问题。你可以这样做,它会工作的,但是单元测试
函数getBody(url)
变得非常困难。我只是通过艰苦的学习!对我来说,这是最好的回答谢谢@user3520261你的回答解决了我的大问题。