完整的github存储库https://github.com/suubcity/fso-blog-list/tree/bb3b8f623da4d9a5dcf87c2d82ccf3715dfbd3fb
将无效标记发送到此代码行时...
const decodedToken = jwt.verify(req.token, process.env.SECRET);
'TYPEOF:',
我想用下面的错误处理器来处理它。错误处理器工作,我得到状态码和json返回,但我的应用程序仍然崩溃。我如何防止崩溃?
中间件
const errorHandler = (err, request, res, next) => {
logger.error(err.message);
if (err.name === 'ValidationError') {
return res.status(400).json({ error: err.message });
} else if (err.name === 'JsonWebTokenError') {
res.status(401).json({ error: 'invalid token' });
}
next(err);
};
错误讯息
Connected to MongoDB
Server running on port 3001
invalid signature
POST /api/blogs 401 25 - 9.366 ms
JsonWebTokenError: invalid signature
at /home/martyn/Documents/projects/fso-blog-list/node_modules/jsonwebtoken/verify.js:133:19
at getSecret (/home/martyn/Documents/projects/fso-blog-list/node_modules/jsonwebtoken/verify.js:90:14)
at Object.module.exports [as verify] (/home/martyn/Documents/projects/fso-blog-list/node_modules/jsonwebtoken/verify.js:94:10)
at /home/martyn/Documents/projects/fso-blog-list/controllers/blogs.js:13:27
at newFn (/home/martyn/Documents/projects/fso-blog-list/node_modules/express-async-errors/index.js:16:20)
at Layer.handle [as handle_request] (/home/martyn/Documents/projects/fso-blog-list/node_modules/express/lib/router/layer.js:95:5)
at next (/home/martyn/Documents/projects/fso-blog-list/node_modules/express/lib/router/route.js:137:13)
at Route.dispatch (/home/martyn/Documents/projects/fso-blog-list/node_modules/express/lib/router/route.js:112:3)
at newFn (/home/martyn/Documents/projects/fso-blog-list/node_modules/express-async-errors/index.js:16:20)
at Layer.handle [as handle_request] (/home/martyn/Documents/projects/fso-blog-list/node_modules/express/lib/router/layer.js:95:5)
at /home/martyn/Documents/projects/fso-blog-list/node_modules/express/lib/router/index.js:281:22
at Function.process_params (/home/martyn/Documents/projects/fso-blog-list/node_modules/express/lib/router/index.js:335:12)
at next (/home/martyn/Documents/projects/fso-blog-list/node_modules/express/lib/router/index.js:275:10)
at Function.handle (/home/martyn/Documents/projects/fso-blog-list/node_modules/express/lib/router/index.js:174:3)
at router (/home/martyn/Documents/projects/fso-blog-list/node_modules/express/lib/router/index.js:47:12)
at newFn (/home/martyn/Documents/projects/fso-blog-list/node_modules/express-async-errors/index.js:16:20)
2条答案
按热度按时间iezvtpos1#
我在学习同样的课程时也遇到过同样的问题。
所以,我遇到了一个服务器停止/崩溃/死亡的问题,这是由于使用了几个库。Jsonwebtoken,mongoose,bcryptjs都有同样的问题--如果它们得到任何类型的意外数据,它们抛出一个错误,使服务器停止。看起来这些问题必须由课程中编写的errorHandler中间件来处理(next)使服务器等待下一个命令/请求但是如果jsonwebtoken在“授权:bearer***”头或令牌格式错误(手写无意义令牌)或令牌过期时,服务器停止。只有令牌有效时,服务器才会停止。
如果mongoose得到了一些(任何)不符合模型中所写的验证要求的数据,它就会抛出一个错误,导致服务器停止。
如果bcrypt没有得到密码来解析/验证/解密-它会抛出一个错误,导致服务器停止。
然后,突然,我发现我错过了添加一个叫做express-async-error的库,课程中清楚地说明了这一步,要么用try/catch块将“await”的每个调用 Package 在“async”函数中,用“catch”捕获错误,或(!)安装express-async-error库。所以我已经通读了5遍,直到我明白我已经删除了所有的try/catch块,并且没有“t安装此存储库。
所以,这解决了mongoose和bcrypt的所有问题,但是jsonwebtoken仍然不想在没有授权头或空令牌时停止服务器崩溃。
我的解决方案是添加另一个在
jwt.verify(req.token, process.env.SECRET)
之前返回错误的中间件。另外,mongoose和bcryptjs的错误看起来完全一样,我的意思是,在添加express-async-error库之前,它们具有相同的结构,这就是我提到它们的原因
bhmjp9jg2#
我也遇到了同样的问题...简单的解决方法是使用try和catch。