Bluebird promisifaction是一个小魔术,request
相当混乱(它是一个作为一个方法的对象的功能)。
具体方案非常简单:我有一个启用了cookie的请求实例,通过cookie jar(不使用request
的全局cookie处理程序)。我怎样才能有效地宣传它,以及它支持的所有方法?
理想情况下,我希望能够:
request(url)
- >承诺request.getAsync(url)
- >承诺request.postAsync(url, {})
- >承诺似乎Promise.promisifyAll(request)
无效(因为我得到“postAsync未定义”)。
以下应该有效:
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
)并忽略其他参数(即body
)。
你可以使用request-promise模块。
世界着名的HTTP客户端“请求”现在承诺/ A +兼容。蓝鸟技术支持。
安装模块,您可以使用承诺样式的请求。
npm install request-promise
请注意,您不需要第三个回调参数body
。它也出现在response
参数上。如果你check the source你可以看到body
只是response.body
的便利。它们保证始终相同。
这意味着此页面上其他答案中描述的简单promisification足以获取所有响应数据。
const request = require('request')
const { promisify } = require('util')
const rp = promisify(request)
rp('https://example.com').then(({body, statusCode}) => ...)
这只适用于传递给回调/承诺的response
。传递给响应事件的response
对象是标准的http.IncomingMessage
,因此没有body
属性。
我举一个例子,由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
});
或者,等效使用async/await
:
const foo = async () => {
const {statusCode, body} = await getAsync("http://stackoverflow.com")
// do something
}