Express: new Error()在server.js/index.js之外不工作



我基于这个链接创建了一个简单的自定义异常,如下所示:

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

相关内容

  • 没有找到相关文章

最新更新