express.js,如果删除下一个参数,错误处理程序将不起作用

时间:2018-08-13 16:24:21

标签: javascript node.js express eslint

我正在学习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");
});

enter image description here

如您在图像中看到的, eslint抱怨next参数,该参数已声明并且从未使用过。我同意,但是如果删除它,express不会显示错误页面。

为什么会这样?

这对我来说很危险,因为我再也不能相信eslint或我的编码学位了?我肯定会丢失一些东西。 但是什么

4 个答案:

答案 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之后,将永远不会执行该操作。