Как сгенерировать ошибку в pre обработчике в Hapi.js - PullRequest
0 голосов
/ 18 сентября 2018

Я начал использовать v17 из Hapi.js, и у меня возникают проблемы при использовании предварительного обработчика.

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

module.exports = {
    method: "POST",
    path: "/users",
    config: {
        auth: false,
        pre: [{ method: verify_unique_user}],
        handler: create_user.create
    }
}

Содержимое verify_unique_user равно ...

async function verify_unique_user(req, h) {

    await User.findOne({
        $or: [{email: req.payload.email}, {username: req.payload.username}]
    },
    (err, user) => {

        if (user) {

            // Check if username exists.
            if (user.username === req.payload.username) {
                throw Boom.badRequest("Username taken!");
            }

            // Check if email exists.
            if (user.email === req.payload.email) {
                throw Boom.badRequest("Email taken!");
            }
        }

    });

    return req;
}

Предположим, что пользователь уже существует в базе данных.Тогда будет выдана ошибка из любого из операторов if.Когда это происходит, я получаю следующую ошибку ...

events.js: 167

 throw er; // Unhandled 'error' event

 ^

Ошибка: имя пользователя занято!на User.findOne (/Users/ericbolboa/Desktop/Warble/server/src/users/util/user_function.js:16:16)

Это разбило мой сервер.Это не то, что я хочу.Если я выдаю ошибку в моей функции обработчика, ответ будет выглядеть следующим образом ...

{
    "statusCode": 400,
    "error": "Bad Request",
    "message": "error"
}

Но всякий раз, когда я выдаю ошибку в предварительном обработчике, мой сервер падает.Как правильно выкинуть ошибки?

1 Ответ

0 голосов
/ 19 сентября 2018

Не уверен, что это является источником проблемы, но вы можете упростить асинхронное / ожидание вместо использования обратного вызова

async function verify_unique_user(req, h) {

    const user = await User.findOne({
        $or: [{email: req.payload.email}, {username: req.payload.username}]
    });

    // Check if username exists.
    if (user.username === req.payload.username) {
        throw Boom.badRequest("Username taken!");
    }

    // Check if email exists.
    if (user.email === req.payload.email) {
        throw Boom.badRequest("Email taken!");
    }

    return req;
}
...