javascript - 如何在 Hapi.js 的预处理程序中抛出错误

标签 javascript node.js rest hapi.js

我开始使用 Hapi.jsv17,并且在使用预处理程序时遇到了问题。

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

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

 ^

Error: Username taken! at User.findOne (/Users/ericbolboa/Desktop/Warble/server/src/users/util/user_function.js:16:16)

这使我的服务器崩溃了。这不是我想要的。如果我在处理函数中抛出错误,响应将如下所示...

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

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

最佳答案

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

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

关于javascript - 如何在 Hapi.js 的预处理程序中抛出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52394028/

相关文章:

api - 带链接的 REST 资源表示,兼容 PUT 和 GET

.net - WCF:不支持没有参数的操作

javascript - 在 javascript 中定义属性方法的正确模式 "class"

javascript - 如何通过 JavaScript 访问打印机 SNMP 数据

node.js - Nodejs数据交换

javascript - Npm postinstall 仅用于开发

Angular 7 - 在单元测试中捕获 HttpErrorResponse

javascript - React-Native 全屏背景图片

javascript - Three.js(版本102)如何使用OrbitControls设置相机的默认位置和旋转

javascript - Node : Sending a request once, 但有两个输出?