我正在使用NodeJS util.promisifiy函数,以便可以对内置的https模块使用promise和async / await,而不必安装任何依赖项。我唯一不确定的是POST请求的语法应该是什么,因为通常将请求数据写入流中:
var req = https.request(options, (res) => {
//stuff
});
req.write(data);
如果https模块被“承诺”,它是否以相同的方式工作?因此:
const request = promisify(https.request);
var req = request(options);
req.write(data);
或者这样:
var response = await request(options, data);
我似乎找不到有关HTTP / HTTPS函数语法的信息。我发现的所有示例都使用fs模块。
答案 0 :(得分:1)
据我所知:不,它不会工作。
promisify
所做的全部工作就是将遵循“错误优先回调”设计的函数包装到promise中。为此,给定功能必须:
function
作为最后(或唯一)参数预期使用以下命令调用作为最后一个参数传递的回调函数:
如果满足所有这些条件,则“承诺功能”将执行以下操作:
reject
第一个参数的诺言resolve
带有任何其他参数的诺言了解了上述内容后,我们可以轻松实现请求方法的自己的“承诺”版本:
// untested example code!
function postData(options, data) {
return new Promise((resolve, reject) => {
const req = https.request(options);
req.on("data", (chunk) => {});
req.on("error", (err) => {
reject(err);
})
req.on("end", (res) => {
// check if result is satisfactory and either resolve/reject here
if (res.isFine) {
resolve(res);
} else {
reject(new Error("Response indicated failure"));
}
});
// Send the data off
req.write(data);
});
}
这比仅调用一个函数更为冗长,但它易于阅读,并且很清楚此函数的作用。
个人建议:远离此类“实用程序”。如果您不了解代码内部发生了什么,如何调试它?创建这样一个简单的包装程序所需的一点开销远远超过了期望所要执行的功能的“希望”。