Express.js自定义错误处理中间件不适用于一些错误



自定义错误处理程序:

export const errorHandler: ErrorRequestHandler = (err, _, res) => {
if (err instanceof HttpError) {
res.status(err.statusCode).json({
message: err.message
});
return;
}
res.status(500).json({
message: err.message,
});
};

我抛出错误的处理程序:

export const registerHandler: Handler = async (req, res) => {
const { username, password } = req.body as {
username: string | undefined;
password: string | undefined;
};
if (!username || !password) {
throw new UnprocessableEntity();
}
try {
const user = await User.register(username, password);
req.logIn(user, (err) => {
console.log(err);
});
res.json({
user,
});
} catch (error) {
throw new BadRequest(error.message);
}
};

除了在registerHandler的catch块中抛出错误处理程序外,错误处理程序中间件在任何地方都能正常工作。它把我逼疯了。有人能解释一下为什么会这样吗?

中间件是管道,换句话说,是在另一个函数之后运行的函数,所以如果你想运行错误处理程序,你需要传递下一个函数来运行


export const registerHandler: Handler = async (req, res, next) => {
const { username, password } = req.body as {
username: string | undefined;
password: string | undefined;
};
if (!username || !password) {
// to let express know that the next function to run is an errorhandler you need to pass a parameter to the function next
return next(new UnprocessableEntity());
}
try {
const user = await User.register(username, password);
req.logIn(user, (err) => {
console.log(err);
});
res.json({
user,
});
} catch (error) {
throw new BadRequest(error.message);
}
};

要创建错误处理程序,需要创建一个具有4个参数的函数error:错误请求res:响应下一个:下一个处理程序

function errorHandler (error, req, res, next) {
if (err instanceof HttpError) {
return res.status(err.statusCode).json({
message: err.message
});
}
return next(error);
}

要做到这一点,您需要在所有路由之后指定错误处理程序


const app = express()
app.use("/api", apiRoutes());
app.use("/more-routes", moreRoutes());
app.use(errorHandler);
app.use(anotherErrorHandler);

这可能不是您想要的确切解决方案,但可能会有所帮助

express js文档上面写着:-

  • 从Express5开始,返回Promise的路由处理程序和中间件将在拒绝或抛出错误时自动调用next(value(

所以你根本不需要尝试和捕捉。

上述代码可以写成:-

export const registerHandler: Handler = async (req, res) => {
const { username, password } = req.body as {
username: string | undefined;
password: string | undefined;
};
if (!username || !password) {
throw new UnprocessableEntity();
}

const user = await User.register(username, password);
req.logIn(user, (err) => {
console.log(err);
});
res.json({
user,
});
};

如果等待行中发生任何错误,将自动调用errorHandler,并且不必显式抛出错误。

最新更新