Route.get () требует функцию обратного вызова, но получил [обещание объекта] - PullRequest
0 голосов
/ 18 февраля 2019

Я создаю REST API с экспресс-расширением, следуя архитектуре этой статьи .Короче говоря, маршрутизатор вызывает контроллер.

Вот пример вызова:

router.get('/', ModelsController.getModels)

Пока это нормально работает, и теперь я улучшаю обработку ошибок с помощьюBoom.

Я хотел бы использовать обертку, как в этой статье , но, поскольку я не использую TS и поскольку я незнаком с Promises, я борюсь с этим.

Вот обертка:

exports.enhanceHandler = async function (handler) {
    return async function (req, res, next) {

        try {
            const result = await handler(req, res);
            if (result instanceof Error && Boom.isBoom(result)) {
                res.status(result.output.statusCode).send(formatBoomPayload(result));
            }
        } catch (error) {
            // now log errors to your errors reporting software
            if (process.env.NODE_ENV !== "production" && (error.stack || error.message)) {
                res.status(500).send(error.stack || error.message);
            } else {
                res.status(500).send(Boom.internal().output.payload);
            }
        }

        next();
    }
}

Я пытаюсь вызвать ее в моем маршрутизаторе, например:

router.get('/handler', enhanceHandler(ModelsController.getModels))

Однако у меня есть эта ошибка:

Error: Route.get() requires a callback function but got a [object Promise]

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

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Посмотрим, что происходит.Вы вызвали get () и для второго параметра вы использовали вызов EnhidHandler ().Вызов любой асинхронной функции возвращает Promise .В то время как get требует ссылки на функцию в качестве второго параметра.

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

0 голосов
/ 18 февраля 2019

У каждого объекта обещания есть метод .then, который необходимо использовать для получения результата от объекта обещания, например:

handler(req, res).then((res) => {
    if (res instanceof Error && Boom.isBoom(res)) {
        res.status(res.output.statusCode).send(formatBoomPayload(res));
    }
});

Мы также можем удалить асинхронную функцию из функции, если мы неиспользую жду больше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...