[英]How do you properly promisify request?
Bluebird promisifaction 是一个小魔法,而request
是一团糟(它是一个具有方法的对象的函数)。
具体场景非常简单:我有一个启用了 cookie 的请求实例,通过 cookie jar(不使用request
的全局 cookie 处理程序)。 我怎样才能有效地承诺它,以及它支持的所有方法?
理想情况下,我希望能够:
request(url)
-> Promiserequest.getAsync(url)
-> Promiserequest.postAsync(url, {})
-> Promise 似乎Promise.promisifyAll(request)
无效(因为我收到“未定义 postAsync”)。
以下应该工作:
var request = Promise.promisify(require("request"));
Promise.promisifyAll(request);
请注意,这意味着request
不是一个自由函数,因为 promisification 与原型方法一起工作,因为this
事先不知道。 它仅适用于较新版本的 bluebird。 当您需要分叉 cookie 的请求对象时重复它。
如果您使用的是 Bluebird v3,则需要使用multiArgs
选项:
var request = Promise.promisify(require("request"), {multiArgs: true});
Promise.promisifyAll(request, {multiArgs: true})
这是因为 request 的回调是(err, response, body)
:Bluebird v3 的默认行为是只采用第一个成功值参数(即response
)并忽略其他参数(即body
)。
您可以使用request-promise模块。
世界著名的 HTTP 客户端“Request”现在符合 Promises/A+。 由蓝鸟提供支持。
安装模块,您可以使用 promise 样式的请求。
npm install request-promise
请注意,您不需要第三个回调参数body
。 它也存在于response
参数中。 如果您查看源代码,您会发现body
只是response.body
一种方便。 它们保证始终相同。
这意味着本页其他答案中描述的简单承诺足以获取所有响应数据。
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
base on 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
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.