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();
}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;
解释
-
定义路由处理器:
- 在路由处理器中,我们尝试从会话中获取用户名,并通过
findUserByName函数查找该用户。 - 如果没有找到用户,我们调用
next(new Error('User not found')),这将触发错误处理中间件。
- 在路由处理器中,我们尝试从会话中获取用户名,并通过
-
错误处理中间件:
- 我们定义了一个错误处理中间件,它接受四个参数:
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状态码和错误消息等。
注意,错误处理中间件必须放在所有其他非错误处理中间件之后,否则它们可能不会被正确调用。

