作者:曾经 | 来源:互联网 | 2022-12-08 19:54
如何解决《graphql+apollo-server-express,如何处理快递authMiddleware中的auth错误?》经验,应该怎么弄,您有好建议吗?
我无法弄清楚如何在authMiddleware函数中处理auth错误。
这是我authMiddleware
使用传统表达方式错误处理的功能。
const jwt = require('jsonwebtoken');
const { appConfig } = require('../config');
function authMiddleware(req, res, next) {
let token;
const parts = req.headers.authorization.split(' ');
if (parts.length === 2) {
const schema = parts[0];
const credentials = parts[1];
if (/^Bearer$/i.test(schema)) {
token = credentials;
} else {
// throw new Error();
next(new Error('credentials_bad_scheme: Format is Authorization: Bearer [token]'));
}
}
try {
const { user } = jwt.verify(token, appConfig.JWT_SCERET);
req.user = user;
} catch (error) {
// console.log(error);
next(error);
}
next();
}
exports.authMiddleware = authMiddleware;
但是用apollo-server-express
和graphql
系统。在error
传递到next
功能不做工精细。这意味着express
使用graphql
工具堆栈时,错误处理方式似乎不再起作用。
该error
中authMiddleware
不会通过以下快递错误处理中间件
app.use((err, req, res) => {
console.log('error handler: ', err);
});
如果我使用return res.status(401).json({code: 1001, msg: 'Authorization failed'})
或身份验证失败时throw new Error('xxx')
进入catch
。该请求将永远在此处停止,这意味着永远不会停止graphqlExpressHandler
。为了让请求下降到graphqlExpressHandler
,我只能为错误做的事情是使用console.log
打印它们。
而且没有办法使用express-jwt
unless
方法或credentialsRequired
属性。因为当使用graphql时,只有一个名为'/ graphql'的路由。因此,除非/ graphql route
解决此问题的一种方法是:auth
以传统方式处理静态api 并对其进行处理。使graphql
API进行数据查询。