Разрешение обещания внутри функции приводит к тому, что X (...) не является ошибкой функции - PullRequest
0 голосов
/ 04 февраля 2020

Я работаю над нагрузочным тестированием моего API, но в какой-то момент я вызываю другой API. Так как я не хочу подчеркивать второй, всякий раз, когда я загружаю тестирование, я хочу установить тайм-аут и вернуть ответ OK, как это:

function sendMessage(requestLib, blockApi, logger) {
    if(!blockApi){
        return (*my params*) => requestLib(`someURL`, {
            headers: { Authorization: `Bearer ${token}` },
            method: 'post',
            data
        });
    }else{
        logger.info("About to use the promise");
        const response = returnOk.then(function() {
            return new Response(200, {}, null, 'dummy.com');
        });
        return response;
    }
}

returnOk - Обещание, которое я определил ранее таким образом :

const returnOk = new Promise((resolve, reject) => {
    setTimeout( function() {
      resolve("Success!") 
    }, 2000) 
  });

И функция sendMessage вызывается внутри другой функции, подобной этой:

module.exports = ({ requestLib, Logger }) => async function(req, res) {
     // Some unrelated code to decide if I'll call sendMessage
     const response = await sendMessage(requestLib, blockApi, logger)(params);
     // I log the response
     res.end();
}

Обычный поток работает как шарм, но когда я тестирую нагрузку и Я получаю returnOk.then () ... Выдает

sendMessage (...) не является функцией

Если я удаляю таймаут и просто возвращаю

return new Response(200, {}, null, 'dummy.com');

Все работает отлично.

1 Ответ

1 голос
/ 05 февраля 2020

По какой-то причине ваша функция sendMessage(…) возвращает другую функцию:

return (*my params*) => …

Вам нужно будет сделать то же самое при насмешке sendMessage:

function sendMessage(requestLib, blockApi, logger) {
    if (!blockApi) {
        return (*my params*) => requestLib(`someURL`, {
            headers: { Authorization: `Bearer ${token}` },
            method: 'post',
            data
        });
    } else {
        return (*my params*) => {
            const returnOk = new Promise((resolve, reject) => {
                setTimeout(resolve, 2000) 
            });
            logger.info("About to use the promise");
            return returnOk.then(function() {
                return new Response(200, {}, null, 'dummy.com');
            });
        };
    }
}

Кстати, вы на самом деле не должно быть этого логического параметра blockApi равным sendMessage. Напишите две разные функции с одинаковой сигнатурой и используйте внедрение зависимостей в коде, который его вызывает.

...