如何在 Hapi.js 中的预处理程序中抛出错误
How to throw an error inside the pre handler in Hapi.js
我开始使用 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
^
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/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;
}
看看route的工具包(h)和options.response.failAction
一条路线可以在选项中设置response.failAction
。在那里,您可以根据需要格式化错误消息并发送响应。这包括预处理程序抛出的错误。
编辑:每个预处理器都可以有自己的 'failAction' 处理器。如果你想停止链,你必须做一个 response(...).takeover()
。
我开始使用 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 ^
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/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;
}
看看route的工具包(h)和options.response.failAction
一条路线可以在选项中设置response.failAction
。在那里,您可以根据需要格式化错误消息并发送响应。这包括预处理程序抛出的错误。
编辑:每个预处理器都可以有自己的 'failAction' 处理器。如果你想停止链,你必须做一个 response(...).takeover()
。