egg-jwt如何更改抛出错误,更改返回给前端的错误信息
时间: 2024-03-21 08:40:44 浏览: 183
在egg-jwt中,抛出错误和返回给前端的错误信息都可以进行自定义。egg-jwt内置了一些错误类型,例如`TokenExpiredError`和`JsonWebTokenError`,可以通过配置来自定义这些错误的处理方式。
下面是一个例子,演示如何自定义`TokenExpiredError`的抛出和返回给前端的错误信息:
```javascript
// config/config.default.js
exports.jwt = {
secret: 'your secret key',
expiresIn: '1h',
enable: true, // 开启egg-jwt插件
ignore: ['/login'], // 不需要进行token校验的路由
jwtError(ctx, err) {
if (err.name === 'TokenExpiredError') {
ctx.status = 401;
ctx.body = {
code: 401,
message: 'token已过期,请重新登录'
};
}
}
};
// app/middleware/auth.js
const jwt = require('jsonwebtoken');
module.exports = (options, app) => {
return async function auth(ctx, next) {
const token = ctx.header.authorization;
if (!token) {
ctx.throw(401, '未登录,请先登录');
}
try {
const decoded = jwt.verify(token, app.config.jwt.secret);
ctx.user = decoded;
await next();
} catch (err) {
app.config.jwt.jwtError(ctx, err);
}
};
};
// app/router.js
module.exports = app => {
const { router, controller } = app;
router.post('/login', controller.user.login);
router.get('/user', app.middleware.auth(), controller.user.index);
};
```
在上面的例子中,我们在`config.default.js`中配置了`jwtError`函数,它会在验证JWT时出现错误时被调用。在这个函数中,我们检查错误的类型是否为`TokenExpiredError`,如果是,就将HTTP状态码设置为401,并返回一个错误信息给前端。
在`app/middleware/auth.js`中,我们通过`jwt.verify()`方法验证JWT,如果验证失败,就调用`jwtError`函数处理错误。注意,我们在这里使用了`ctx.throw()`方法来抛出错误,而不是直接返回错误信息,这是因为在`jwtError`函数中,我们需要获取HTTP状态码和设置响应体。
最后,在`app/router.js`中,我们将`auth`中间件应用到需要进行token校验的路由上,例如`/user`路由。这样,当用户访问`/user`路由时,会先经过`auth`中间件进行token校验,如果token无效或已过期,就会返回错误信息。
阅读全文