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

Posted

技术标签:

【中文标题】express.js,如果我删除下一个参数,错误处理程序将不起作用【英文标题】:express.js, error handler doesn't work if I remove next parameter 【发布时间】:2019-01-20 10:37:14 【问题描述】:

我正在学习 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 或我的编码学位?我肯定错过了一些东西。 但是什么

【问题讨论】:

What is the parameter "next" used for in Express?的可能重复 【参考方案1】:

因为express中的错误处理是由参数个数决定的:

  (function (req, res, next)  ).length // 3
  (function (err, req, res, next) ).length // 4
  (function (err, req, res) ).length // 3

因此,如果您删除参数,错误处理程序将不再被视为错误处理程序。

这对我来说很危险,因为我不再信任 eslint 或我的编码学位?

如果 linter 比程序员更能理解代码……我们为什么需要程序员?

【讨论】:

请您解释一下好吗?【参考方案2】:

这是 ESlint 的已知问题,但他们仍然没有解决该问题。 如果未使用 res、req 之一,ESlint 不会给出错误,但会在需要 4 个参数的错误处理程序中给出。 有两种解决方案,一种是针对此错误禁用 ESlint 的下一行,如下所示:

// eslint-disable-next-line no-unused-vars
app.use((error, req, res, next) => 

另一个我只在错误处理程序的末尾使用next(),在发生错误时渲染或发送json后永远不会执行。

【讨论】:

【参考方案3】:

next() 是处理异步错误所必需的。添加:

  if (err) 
     next(err);
  

【讨论】:

请您解释一下好吗?【参考方案4】:

Eslint 要求您使用传递给函数的所有参数。

对于您的情况,您有两个选择,在函数末尾执行 next () 或在 eslint cmets 中包含相同的函数:

/ * 禁用 eslint */ / * eslint-enable * /

【讨论】:

以上是关于express.js,如果我删除下一个参数,错误处理程序将不起作用的主要内容,如果未能解决你的问题,请参考以下文章

如何记录 express.js POST 参数 [重复]

我无法恢复服务器 Express Js 中的 ID 以在我的 BD 中删除

在 Express 中 next() 接受啥参数

Express.js 中删除 req.body 时的空对象

使用 Node.js 和 Express.js 在 MySQL 中删除给定值数组的多行

Express.js 响应超时