Nodejs express next(err) 如何在下一个handler中获取传过去的err

Nodejs express next(err) 如何在下一个handler中获取传过去的err

express next(err) 如何在下一个handler中获取传过去的err。例如:

router.get('/', function(req, res, next) {
  var user = User.findUserByName(req.session.user.username);
  if(!user) return next('user not found');      // 这里给next传入的参数,在下一个处理器中怎么找到这个参数
  next();
}

6 回复

Node.js Express 中 next(err) 的错误处理

在 Express 应用程序中,当我们在中间件或路由处理器中遇到错误时,通常会使用 next(err) 将错误传递给下一个错误处理中间件。这些错误处理中间件可以捕获并处理这些错误。

示例代码

假设我们有一个简单的 Express 路由,其中包含一个错误处理逻辑:

const express = require('express');
const router = express.Router();

// 模拟用户查找函数
function findUserByName(username) {
  const users = [
    { username: 'alice', password: 'password123' },
    { username: 'bob', password: 'password456' }
  ];
  return users.find(user => user.username === username);
}

router.get('/', function(req, res, next) {
  const user = findUserByName(req.session.user.username);
  
  if (!user) {
    return next(new Error('User not found')); // 使用 new Error 创建错误对象
  }
  
  res.send(`Hello, ${user.username}!`);
});

// 错误处理中间件
router.use(function(err, req, res, next) {
  console.error(err.stack); // 输出错误堆栈信息
  res.status(500).send('Something broke!');
});

module.exports = router;

解释

  1. 定义路由处理器:

    • 在路由处理器中,我们尝试从会话中获取用户名,并通过 findUserByName 函数查找该用户。
    • 如果没有找到用户,我们调用 next(new Error('User not found')),这将触发错误处理中间件。
  2. 错误处理中间件:

    • 我们定义了一个错误处理中间件,它接受四个参数:err, req, res, 和 next
    • 这个中间件接收 next 传递的错误对象,并输出错误堆栈信息。
    • 最后,它发送一个状态码为 500 的响应,告诉客户端发生了错误。

通过这种方式,我们可以确保在遇到错误时,能够正确地传递和处理错误信息。


app.use(function(err,req,res,next){});

req.error = “user not found”; next();

我都是这么搞

嗯嗯,是的。thx

这样的话,我的理解是。认为你要在下一个中间件中判断req.error对象并进行相应的处理。如果这样的情况多了,很多中间件都要写处理err的代码。感觉没有统一在function(err, req, res, next){ // blablabla }中处理的好。

在Express.js中,当你使用next(err)来传递错误时,默认情况下,Express会将这个错误对象传递到错误处理中间件(error-handling middleware)。错误处理中间件是一个特殊的中间件函数,它接受四个参数:(err, req, res, next)。因此,你可以通过定义一个错误处理中间件来捕获由next(err)传递的错误。

下面是如何定义一个错误处理中间件以捕获并处理这些错误:

// 定义路由处理函数
router.get('/', function(req, res, next) {
  var user = User.findUserByName(req.session.user.username);
  if (!user) return next('user not found'); // 传递错误字符串
  next(); // 继续处理后续中间件
});

// 定义错误处理中间件
app.use(function(err, req, res, next) {
  console.error(err); // 打印错误信息
  res.status(404).send({ error: err }); // 发送错误响应
});

在这个例子中,当路由处理函数找不到用户时,它会调用next('user not found'),这会导致控制权转移到错误处理中间件。错误处理中间件接收err作为第一个参数,并可以对其进行处理,例如记录错误、发送适当的HTTP状态码和错误消息等。

注意,错误处理中间件必须放在所有其他非错误处理中间件之后,否则它们可能不会被正确调用。

回到顶部