你如何正确地宣传请求?

时间:2015-02-03 20:27:59

标签: javascript promise bluebird

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

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

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

  • 致电request(url) - >许
  • 致电request.getAsync(url) - >许
  • 致电request.postAsync(url, {}) - >许

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

4 个答案:

答案 0 :(得分:37)

以下内容应该有效:

var request = Promise.promisify(require("request"));
Promise.promisifyAll(request);

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


如果您正在使用Bluebird v3,那么您将要使用multiArgs选项:

var request = Promise.promisify(require("request"), {multiArgs: true});
Promise.promisifyAll(request, {multiArgs: true})

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

答案 1 :(得分:33)

您可以使用request-promise模块。

  

世界着名的HTTP客户端"请求"现在Promises / A +兼容。   由Bluebird提供技术支持。

安装模块,您可以使用承诺风格的请求。

npm install request-promise

答案 2 :(得分:2)

我基于{strong> Node.js v11.10.0

util为例
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 
     });

或者等效地使用async/await

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

答案 3 :(得分:2)

请注意,您不需要第三个回调参数body。它也出现在response参数上。如果您check the source,可以看到body只是response.body的便利。他们保证总是一样。

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

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

rp('https://example.com').then(({body, statusCode}) => ...)

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