【问题标题】:How to throw an error inside the pre handler in Hapi.js如何在 Hapi.js 的预处理程序中引发错误
【发布时间】:2019-02-22 22:19:11
【问题描述】:

我开始使用Hapi.js 中的v17,但在使用预处理程序时遇到了问题。

我想将用户保存到数据库中,但首先我使用预处理程序检查用户是否已经存在。如果用户存在,我想抛出一个错误。我的路线结构是这样的......

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"
}

但每当我在预处理程序中抛出错误时,我的服务器就会崩溃。如何正确抛出错误?

【问题讨论】:

    标签: javascript node.js rest hapijs


    【解决方案1】:

    不确定这是否是问题的根源,但您可以简化 async/await 而不是使用回调

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

    【讨论】:

    • 是的,这就是问题所在。我的猜测是我在回调中抛出了错误,并且不知何故这导致了问题?
    【解决方案2】:

    看看路由的toolkit(h)和options.response.failAction

    路由可以在选项中设置response.failAction。在那里,您可以随意格式化错误消息并发送响应。这包括从预处理程序抛出的错误。

    编辑:每个预处理程序都可以拥有自己的“failAction”处理程序。如果你想停止链条,你必须做一个response(...).takeover()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-04
      • 1970-01-01
      • 2014-09-01
      • 1970-01-01
      • 2021-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多