【问题标题】:Syntax for POST using Promisify(https)使用 Promisify(https) 的 POST 语法
【发布时间】:2018-12-28 19:45:46
【问题描述】:

我正在使用NodeJS util.promisifiy 函数,这样我就可以将promises 和async/await 与内置的https 模块一起使用,而不必安装任何依赖项。我唯一不确定的是 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 模块。

【问题讨论】:

    标签: node.js post https promise


    【解决方案1】:

    据我所知:不,它不会起作用。

    promisify 所做的只是将一个遵循“错误优先回调”设计的函数包装到一个 Promise 中。为此,给定的函数必须:

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

    预计作为最后一个参数传入的回调函数被调用:

    • 错误对象,要么是假的(表示成功),要么是错误的(表示失败)
    • 表示函数结果的任意数量的附加参数。

    如果满足所有这些条件,“promisified function”会执行以下操作:

    1. 使用所有给定参数和自己的回调调用原始函数
    2. 检查回调的第一个参数是否为假
      • 如果是这样,reject 带有第一个参数的承诺
      • 如果没有,resolve 带有任何附加参数的承诺

    了解了以上内容,我们就可以轻松实现自己的“promisified”版本的请求方法了:

    // 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); 
        });
    }
    

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

    个人忠告:远离此类“实用工具”。如果您不了解代码中发生的事情,您如何调试它?创建一个像这样的简单包装器所需的开销远远超过了函数按照您期望完成它的工作的“希望”。

    【讨论】:

    • 我认为这是正确的答案,虽然它是相当多的样板。另一种选择是使用为您执行此包装的常用模块之一,例如request-promise
    • @ElliotNelson 我认为这是有问题的。这不是复杂的代码,相反,它让想到所有可能出错的事情并处理它们。如果您为自己找到了可行的解决方案,那么重复使用它并没有错。我对您链接的模块的具体问题是,它使用了 Bluebird(又一个依赖项),其中 Promises 内置在 NodeJS 核心中。对我来说这是不必要的。
    • 还不错;我想这肯定取决于商店(如果您团队中的每个 nodejs 项目都已经使用 Bluebird,那么这不是成本)。
    猜你喜欢
    • 2014-03-04
    • 2017-05-07
    • 1970-01-01
    • 2021-07-26
    • 2020-10-20
    • 2012-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多