你如何正确地宣传请求?

Mad*_*iha 31 javascript promise bluebird

Bluebird promisifaction有点神奇,而且request非常混乱(它是一个与方法一起作为对象的函数).

具体方案非常简单:我有一个启用了cookie的请求实例,通过cookie jar(不使用request全局cookie处理程序).我怎样才能有效地宣传它,以及它支持的所有方法?

理想情况下,我希望能够:

  • 打电话request(url)- >承诺
  • 打电话request.getAsync(url)- >承诺
  • 打电话request.postAsync(url, {})- >承诺

似乎Promise.promisifyAll(request)无效(因为我得到"postAsync未定义").

Ben*_*aum 38

以下应该有效:

var request = Promise.promisify(require("request"));
Promise.promisifyAll(request);
Run Code Online (Sandbox Code Playgroud)

请注意,这意味着它request不是自由函数,因为promisification适用于原型方法,因为this事先不知道.它只适用于较新版本的蓝鸟.在需要分配cookie的请求对象时,请重复此步骤.


如果您使用的是Bluebird v3,则需要使用以下multiArgs选项:

var request = Promise.promisify(require("request"), {multiArgs: true});
Promise.promisifyAll(request, {multiArgs: true})
Run Code Online (Sandbox Code Playgroud)

这是因为请求的回调是(err, response, body):Bluebird v3的默认行为是仅获取第一个成功值参数(即response)并忽略其他参数(即body).

  • @dopatraman IIRC 2.8+或类似的东西 (2认同)

Arv*_*ran 33

您可以使用请求承诺模块.

世界着名的HTTP客户端"请求"现在承诺/ A +兼容.蓝鸟技术支持.

安装模块,您可以使用承诺样式的请求.

npm install request-promise
Run Code Online (Sandbox Code Playgroud)


Lit*_*oys 8

我举个例子,util基于Node.js v11.10.0

import { get, post } from "request";
import { promisify } from "util";

const [getAsync, postAsync] = [get, post].map(promisify);


getAsync("http://stackoverflow.com")
    .then(({statusCode, body}) => { 
       //do something 
     });
Run Code Online (Sandbox Code Playgroud)

或者,等效地使用async/await

const foo = async () => {
    const {statusCode, body} = await getAsync("http://stackoverflow.com")
    // do something
}
Run Code Online (Sandbox Code Playgroud)


Tam*_*lyn 5

请注意,您不需要第三个回调参数body。它也出现在response参数上。如果查看源代码,您会发现这body只是对的方便response.body。他们保证总是一样的。

这意味着此页面上其他答案中所述的简单承诺足以获取所有响应数据。

const request = require('request')
const { promisify } = require('util')
const rp = promisify(request)

rp('https://example.com').then(({body, statusCode}) => ...)
Run Code Online (Sandbox Code Playgroud)

这仅适用于response传递给回调/承诺的情况。response传递给响应事件的对象是标准的http.IncomingMessage,因此没有body属性。