关于 koa2 使用 koa-jwt 出现的问题

在使用 koa-jwt 的时候要进行 Token 的身份认证,处理 UnauthorizedError 错误,所以要添加中间件,但是 koa2 的处理 jwt 创建错误的中间件与 express 不同

express 处理中间件:

// 导入 express 模块
const express = require("express");

//一定要在路由之前配置解析Token的中间件
const expressJWT = require("express-jwt");

// 导入配置文件
const config = require("./config");

// 使用 .unless({ path: [/^\/api\//] }) 指定哪些接口不需要进行 Token 的身份认证(这里需要注意,secret必须配置algorithms属性)
app.use(
  expressJWT({ secret: config.jwtSecretKey, algorithms: ["HS256"] }).unless({
    path: [/^\/api\//]
  })
);

// 身份认证错误中间件
app.use(function (err, req, res, next) {
  // 捕获身份认证失败的错误
  if (err.name === "UnauthorizedError") {
    return res.cc("身份认证失败!");
  } else {
    // 未知错误...
    res.cc(err);
  }
});

// 调用 app.listen 方法,指定端口号并启动web服务器
app.listen(3000, function () {
  console.log("api server running at http://127.0.0.1:3000");
});

express 错误处理中间件是放在 app.use(expressJWT.... 后面的 但是 koa2 确不同,因为我习惯了 express 所以使用 koa2 的时候出现了错误,koa2 应该把错误处理中间件放在前面

const Koa = require("koa");
const app = new Koa();

// 导入配置文件
const { TOKEN_CONF } = require("./config/index");

//一定要在路由之前配置解析Token的中间件
const koaJWT = require("koa-jwt");

// 身份认证错误中间件
app.use(async (ctx, next) => {
  return next().catch(err => {
    if (err.status === 401) {
      // 自定义返回结果
      ctx.status = 401;
      console.log(err.name);
      ctx.body = {
        code: 401,
        msg: err.message
      };
    } else {
      throw err;
    }
  });
});

// 使用 .unless({ path: [/^\/api\//] }) 指定哪些接口不需要进行 Token 的身份认证(这里需要注意,secret必须配置algorithms属性)
app.use(
  koaJWT({ secret: TOKEN_CONF.jwtSecretKey, algorithms: ["HS256"] }).unless({
    path: [/^\/api\//]
  })
);

module.exports = app;

上一篇:node搭配koa-log4进行日志添加和管理使用


下一篇:记录球队成员的数据 --- Cprime plus 14章第6题