我正在学习Express.js
,并使用其生成器生成了一个具有以下内容的新应用:
npm install express-generator -g && express myapp
之后,我在app.js
中看到了以下代码:
// catch 404 and forward to error handler
app.use(function(req, res, next) {
next(createError(404));
});
// error handler
app.use(function(err, req, res, next) {
// set locals, only providing error in development
res.locals.message = err.message;
res.locals.error = req.app.get("env") === "development" ? err : {};
// render the error page
res.status(err.status || 500);
res.render("error");
});
如您在图像中看到的, eslint
抱怨next
参数,该参数已声明并且从未使用过。我同意,但是如果删除它,express
不会显示错误页面。
为什么会这样?
这对我来说很危险,因为我再也不能相信eslint或我的编码学位了?我肯定会丢失一些东西。 但是什么?
答案 0 :(得分:1)
因为express中的错误处理程序由参数数量决定:
(function (req, res, next) { }).length // 3
(function (err, req, res, next) {}).length // 4
(function (err, req, res) {}).length // 3
因此,如果删除该参数,则错误处理程序将不再被视为错误处理程序。
这对我来说很危险,因为我再也不能相信eslint或我的编码学位了?
如果linters会比程序员更了解代码……为什么我们需要程序员?
答案 1 :(得分:0)
next()
对于处理异步错误是必需的。添加:
if (err) {
next(err);
}
答案 2 :(得分:0)
Eslint要求您使用传递给函数的所有参数。
对于您的情况,您有两个选择,可以在函数末尾执行next()或在eslint注释中包含相同的函数:
/ *禁用eslint * / / *启用eslint * /
答案 3 :(得分:0)
这是ESlint的已知问题,但他们仍然没有解决该问题。 如果未使用res,req之一,ESlint不会给出错误,但是会在错误处理程序中给出要求您提供4个参数的错误处理程序。 有2种解决方案,一种是针对该错误的下一行禁用ESlint,如下所示:
// eslint-disable-next-line no-unused-vars
app.use((error, req, res, next) => {
和另外一个i只能在错误处理程序的末尾使用next()
,在发生错误时渲染或发送json之后,将永远不会执行该操作。