使用Promisify(https)

时间:2018-12-28 19:45:47

标签: node.js post https promise

我正在使用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模块。

1 个答案:

答案 0 :(得分:1)

据我所知:不,它不会工作。

promisify所做的全部工作就是将遵循“错误优先回调”设计的函数包装到promise中。为此,给定功能必须:

  • 接受数字[0..n]参数来配置功能
  • 接受function作为最后(或唯一)参数

预期使用以下命令调用作为最后一个参数传递的回调函数:

  • 错误对象(错误(表明成功)或错误(表明失败)
  • 代表函数结果的其他数量的参数。

如果满足所有这些条件,则“承诺功能”将执行以下操作:

  1. 使用所有给定参数及其自身的回调调用原始函数
  2. 检查回调的第一个参数是否为假
    • 如果是,请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); 
    });
}

这比仅调用一个函数更为冗长,但它易于阅读,并且很清楚此函数的作用。

个人建议:远离此类“实用程序”。如果您不了解代码内部发生了什么,如何调试它?创建这样一个简单的包装程序所需的一点开销远远超过了期望所要执行的功能的“希望”。