В пакете, который я создаю, как я могу оставить обработку ошибок, созданных обещаниями для потребителей пакета? - PullRequest
0 голосов
/ 16 ноября 2018

Это простой пакет, который я создаю.

var fetch = require('node-fetch');

function createClient(host, port, body) {
    function httpRequestHelper(body, extractResponseCallback) {
        return fetch(`${host}:${port}`, {
            method: 'post',
            body: JSON.stringify(body)
        })
        .then(function (response) {
            if (!response.ok) {
                throw Error(response.statusText);
            }
            return response.json();
        })
        .then(function(response) {
            if (response.type === 'error') {
                throw Error(response);
            }
            return extractResponseCallback(response);
        })
        .catch(function(error) {
            return Promise.reject(error);
        });    
    }

    function recordings() {
        return httpRequestHelper({ type: 'request', cmd: 'recordings' });
    }

    return {
        recordings: recordings,
    };
}

exports.createClient = createClient;

Я хочу, чтобы потребитель этого пакета мог обрабатывать ошибки по своему усмотрению, например:

try {
    let recordingsResponse = await client.recordings()
    console.log(recordingsResponse);    
} catch (error) {
    console.log(error);
}

Однако, с моим текущим кодом я получаю ошибку:

(node:81180) UnhandledPromiseRejectionWarning: TypeError: undefined is not a function
    at checkCreateProject (/Users/xp025106/Dev/qip-js-http-client/examples.js:15:17)
    at <anonymous>
    at process._tickCallback (internal/process/next_tick.js:188:7)
(node:81180) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 2)
(node:81180) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
seldmac25073:qip-js-http-client xp025106$

Как я могу это исправить?

PS. Я не писал много кода до того, как он должен был использоваться другими, поэтому любые предложения по улучшению кода приветствуются

1 Ответ

0 голосов
/ 16 ноября 2018

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

Похоже на ваш *Функция 1003 * ожидает два аргумента: body и extractResponseCallback.Ваша экспортированная функция recording всегда вызывает ее только с одним аргументом - следовательно, ошибка о том, что undefined не является функцией.

Решение состоит в том, чтобы экспортировать замыкание, связанную функцию или делегировать функцию.аргументы для передачи во втором аргументе, который httpRequestHelper ожидает.В вашем случае делегирование аргументов - это, вероятно, то, что вам нужно, так как ваш потребитель все еще должен вызывать замыкания и связанные функции.

Закрытие

function recordings() {
  return function(callback) {
    return httpRequestHelper({ type: 'request', cmd: 'recordings' }, callback);
  };
}

Связанная функция

function recordings() {
  return httpRequestHelper.bind(null, { type: 'request', cmd: 'recordings' });
}

Делегированные аргументы

function recordings(callback) {
  return httpRequestHelper({ type: 'request', cmd: 'recordings' }, callback);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...