Синтаксис для POST с использованием Promisify (https) - PullRequest
0 голосов
/ 28 декабря 2018

Я использую функцию NodeJS util.promisifiy , чтобы я мог использовать обещания и асинхронную / ожидающую работу со встроенным модулем 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, когда они былиpromisified.Все примеры, которые я нашел, используют модуль fs.

1 Ответ

0 голосов
/ 29 декабря 2018

Насколько я могу сказать: нет, это не сработает.

Все, что делает promisify, это превращает функцию, которая следует схеме "обратный вызов с ошибкой", в обещание.Чтобы это работало, данная функция должна:

  • Принять параметры [0..n] для настройки функции
  • Принять function в качестве последнего (или единственного)параметр

Ожидается, что функция обратного вызова, переданная как последний параметр, вызывается с помощью:

  • Объект ошибки, который либо ложен (указывает на успех), либоОшибка (указывающая на ошибку)
  • Любое количество дополнительных аргументов, представляющих результат функции.

Если все эти критерии выполнены, «обещанная функция» выполняет следующее:

  1. Вызов исходной функции со всеми заданными параметрами и собственным обратным вызовом
  2. Проверить, является ли первый аргумент обратного вызова ложным
    • Если это так, rejectобещание с первым аргументом
    • Если нет, resolve обещание с любыми дополнительными аргументами

Зная вышесказанное, мы легко реализуемнаша собственная "обещанная" версияМетод equest:

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

Это более многословно, чем просто вызов одной функции, но ее легко прочитать, и понятно, что делает эта функция.

Личное словосовета: держитесь подальше от таких "утилит".Если вы не понимаете, что происходит внутри вашего кода, как вы можете его отладить?Небольшая нагрузка, необходимая для создания простой оболочки, подобной этой, намного перевешивает «надежду» на то, что функция выполнит свою работу, так как вы ожидаете этого.

...