index.ts 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import koa from 'koa'
  2. import { koaBody } from 'koa-body'
  3. import koaJwt from 'koa-jwt'
  4. import { SECRET_KEY } from '@/utils/jwt'
  5. import cors from 'koa2-cors'
  6. import logger, { koaLoggerMiddleware } from '@/logger'
  7. import i18n from '@/utils/i18next'
  8. import { zodErrorHandler } from 'koa-zod-errorhandler'
  9. import qs from 'qs'
  10. // import BullBoard from '@/queue/board.queue'
  11. import router from '@/router'
  12. import handleError from '@/constant/err.type'
  13. // 暂时不需要使用到MQTT
  14. // import mqttClient from '@/utils/mqtt'
  15. const app = new koa()
  16. app.use(koaLoggerMiddleware)
  17. // 打印每次收到的请求和回复的消息
  18. app.use(async (ctx, next) => {
  19. logger.debug<object>({ request: ctx.request }, 'Request received.')
  20. await next()
  21. logger.debug<object>({ response: ctx.response }, 'Response Information.')
  22. })
  23. // 不支持打包,暂时屏蔽
  24. // app.use(BullBoard.registerPlugin())
  25. app.use(cors({
  26. origin: '*', // 允许所有来源访问
  27. allowMethods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'], // 允许的方法
  28. allowHeaders: ['Origin', 'X-Requested-With', 'Content-Type', 'Accept', 'Authorization'], // 允许的请求头
  29. }))
  30. app.use(
  31. koaBody({
  32. multipart: true, //解析多个文件
  33. formidable: {
  34. maxFileSize: 10 * 1024 * 1024, // 设置上传文件大小最大限制,默认2M
  35. // uploadDir: 可以填写一个路径,不填默认为 os.tmpDir()
  36. }
  37. })
  38. )
  39. // 将 x-access-token 转换为 Authorization 请求头(兼容x-access-token)
  40. app.use(async (ctx, next) => {
  41. if (ctx.headers['x-access-token']) {
  42. // 如果 x-access-token 存在,转换为 Authorization: Bearer <token>
  43. ctx.headers['authorization'] = 'Bearer ' + ctx.headers['x-access-token'];
  44. delete ctx.headers['x-access-token']; // 删除原来的 x-access-token
  45. }
  46. await next();
  47. })
  48. // 将get请求的query解析到body
  49. app.use(async (ctx, next) => {
  50. if (ctx.request.method === 'GET') {
  51. const parsedQuery = qs.parse(ctx.querystring); // 使用 qs 库解析查询字符串
  52. console.log("ctx.querystring: ", ctx.querystring)
  53. console.log("parsedQuery: ", parsedQuery)
  54. ctx.request.body = parsedQuery;
  55. }
  56. console.log("ctx.request.body: ", ctx.request.body)
  57. await next();
  58. })
  59. // 保护所有路由:使用 koa-jwt 中间件
  60. app.use(koaJwt({ secret: SECRET_KEY, key: 'jwtData' }).unless({
  61. path: [/^\/bee\/login$/, /^\/bee\/register$/] // 排除 /login 和 /register 路由
  62. }))
  63. app.use(zodErrorHandler({
  64. log: (error, ctx) => {
  65. logger.error({ Context: ctx }, `ZOD error : ${error.toString()}`)
  66. }
  67. }))
  68. app.use(i18n)
  69. app.use(router.routes()).use(router.allowedMethods())
  70. // 统一的错误处理
  71. app.on('app error', handleError)
  72. export default app