与其他框架相比,Node.js + Express.js应用程序中的错误报告/处理似乎有所不同.我是否理解它的工作原理如下?
A) 通过接收它们作为回调函数的参数来检测错误.例如:
doSomethingAndRunCallback(function(err) {
if(err) { … }
});
Run Code Online (Sandbox Code Playgroud)
B) 通过调用next(err)在MIDDLEWARE中报告错误.例:
handleRequest(req, res, next) {
// An error occurs…
next(err);
}
Run Code Online (Sandbox Code Playgroud)
C) 通过抛出错误报告 ROUTES中的错误.例:
app.get('/home', function(req, res) {
// An error occurs
throw err;
});
Run Code Online (Sandbox Code Playgroud)
d) 处理通过配置通过app.error自己的错误处理的错误()或使用通用连接错误处理程序.例:
app.error(function(err, req, res, next) {
console.error(err);
res.send('Fail Whale, yo.');
});
Run Code Online (Sandbox Code Playgroud)
这四个原则是Node.js + Express.js应用程序中所有错误处理/报告的基础吗?
我正在使用 Node.js 和 Express 来处理 JWT 身份验证。首先,每次创建和验证用户时,我都会存储一个refresh token内部User集合:
const refreshToken = await jwt.sign({ userId: decoded.user }, process.env.JWT_Refresh_Key);
const user = await User.updateOne({ _id: mongoose.Types.ObjectId(decoded.user) }, { refresh_token: refreshToken, status: true });Run Code Online (Sandbox Code Playgroud)
成功登录后生成 JWT 访问令牌(15 分钟后过期):
const token = await jwt.sign(
{ email: user.email, userId: user._id, role: user.role },
process.env.JWT_Key,
{ expiresIn: '15m' });
res.status(200).json({success: true, token: token});Run Code Online (Sandbox Code Playgroud)
然后access token存储在localStorage由 Angular Http Interceptor 和 auth 方法处理。15分钟后,token处理请求将无效,所以我需要使用refresh token存储在数据库中的。
正在调用刷新方法AuthService.ts …
我是来自 Java 背景的 NodeJs 新手,我试图了解约定next()调用的使用。
我已经浏览了以下帖子 -
1. javascript node.js next()
2. https://www.naeemrana.com/node-js/express-js-middleware-what-is-next/
3.何时在 Node.js 中使用 next() 并返回 next()
我可以理解的是 next() 类似于回调,或者可能是当前函数执行后要执行的下一个函数的引用,
也理解建议使用return next();而不是next();避免函数被重新执行。
以下是来自链接之一的示例代码 -
app.get('/users/:id', function(req, res) {
var user_id = req.params.id;
if(user_id) {
// do something
} else {
next(); // here comes middleware.
}
});
Run Code Online (Sandbox Code Playgroud)
我这里不明白的是正在执行的函数没有第三个参数,
但它确实调用了 next() 函数,这里的想法是什么?
此约定的使用仅用于路由逻辑吗?
next() 是回调吗?它是对下一个要执行的函数的引用吗?或者是其他东西?
app.use(async function(req, res, next) {
try {
var myres = await new Promise((resolve, reject) => {
mysql_connection.query("select * from Users;", (err, rows) => {
if (err) {
reject(err);
} else {
resolve(rows);
}
});
});
} catch (error) {
console.log(error);
}
});
Run Code Online (Sandbox Code Playgroud)
问题是。使用异步功能能够将等待用于数据库查询可以吗?我担心这可能会在expressjs方面引起一些问题。
在文档中它说:
你可以提供多个回调函数,它们的行为就像中间件,除了这些回调可以调用 next('route') 来绕过剩余的路由回调。您可以使用此机制对路由施加前提条件,然后在没有理由继续当前路由的情况下将控制权传递给后续路由。
这是否意味着如果我写这样的路线:
app.get('/', function(req, res, next) {
if (!req.params.id) {
res.statusCode(400).send({error: "id parameter is required"});
next('route');
} else {
next();
}
}, function(req, res) {
res.send({something: 'something'})
});
Run Code Online (Sandbox Code Playgroud)
并且params.id是undefined,那么下一条路线不会被执行,但如果它存在,它会吗?
基本上,编码/命名约定让我有点困惑。为什么不next(false)代替next('route')?