Bluebird promisifaction有点神奇,request
非常混乱(它是一个与方法一起作为对象的函数)。
具体方案非常简单:我有一个启用了cookie的请求实例,通过cookie jar(不使用request
的全局cookie处理程序)。我怎样才能有效地宣传它,以及它支持的所有方法?
理想情况下,我希望能够:
request(url)
- >许request.getAsync(url)
- >许request.postAsync(url, {})
- >许似乎Promise.promisifyAll(request)
无效(因为我得到" postAsync未定义")。
答案 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
属性。