我基于这个链接创建了一个简单的自定义异常,如下所示:
function userErr(message) {
logger.info("reach user error function")
const error = new Error(message);
error.type = "userErr";
return error;
}
function failureErr(message) {
logger.info("reach failure error function")
const error = new Error(message);
error.type = "failureErr";
return error;
}
期望的行为是Express将此错误抛出到server.js文件末尾的自定义错误处理程序中间件:
app.use((error, req, res, next) => {
console.log("Error Handling Middleware: " + error.message);
if (error.type === "userErr") {
res.status(400).json({
status: "error",
statusCode: "400",
message: error.message
});
} else if (error.type === "failureErr") {
res.status(500).json({
status: "fail",
statusCode: "500",
message: error.message
});
} else {
res.status(500).json({
status: "error",
statusCode: "500",
message: error.message
});
}
});
app.listen(8080, () => {
console.log("listening on 8080...");
}); //the server object listens on port 8080
当我把这些函数放在server.js文件(对大多数人来说应该是index.js)中的路由(app.get, app.post等)上面时,它工作得很好。但是,当我开始剥离这些路由并将它们放入routes文件夹中的路由文件时,流量确实正确地到达了路由,但是每当发生错误并执行上面的函数时,JavaScript就会在第二行抛出错误,即:
const error = new Error(message);
例如:
const error = new Error(message);
^
Error: [object Object]
at new failureErr (file:///.../src/server.js:89:17)
at file:///.../src/routes/testRoutes.js:104:21 {
type: 'failureErr'
这很奇怪!我试过把这些函数放到一个单独的文件中,并把它们导入到路由文件中,但它仍然显示同样的错误。
我模仿文件夹进入代码盒(我无法使它运行),所以你可以理解上下文。index.js本身是可以工作的,而带有路由器文件夹的index2.js是失败的。
感谢对问题的任何反馈,或者对我哪里做错了的任何想法
您在沙盒中显示的代码正在执行此throw new userError("It's an user error");
,但userError()
没有正确设置为构造函数,因此不能与new
一起调用。这是沙箱中的代码:
app.get("/api/v1/test", (req, res, next) => {
try {
const userErr = req.headers.userErr;
console.log(userErr);
if (userErr === "true") {
throw new userError("It's an user error");
} else {
throw new failureError("It's an failure error");
}
} catch (e) {
next(e);
}
});
您所展示的代码没有使userError()
或failureError()
成为类或构造函数。它们仅仅是函数。因此,它们不能被new
调用。
如果你想把它们变成类,那么这样做:
class userError extends Error {
constructor(message) {
super(message);
console.log("reach user error function");
this.type = "userErr";
}
}
注意,这是一种比您参考的文章(显然是旧的)中显示的更现代的方法。
或者,你可以直接使用你的函数:
app.get("/api/v1/test", (req, res, next) => {
try {
const userErr = req.headers.userErr;
console.log(userErr);
if (userErr === "true") {
next(userError("It's an user error"));
return;
} else {
next(failureError("It's an failure error"));
return;
}
res.send("ok");
} catch (e) {
next(e);
}
});