index.ts 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  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. app.use(BullBoard.registerPlugin())
  24. app.use(cors({
  25. origin: '*', // 允许所有来源访问
  26. allowMethods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'], // 允许的方法
  27. allowHeaders: ['Origin', 'X-Requested-With', 'Content-Type', 'Accept', 'Authorization'], // 允许的请求头
  28. }))
  29. app.use(
  30. koaBody({
  31. multipart: true, //解析多个文件
  32. formidable: {
  33. maxFileSize: 10 * 1024 * 1024, // 设置上传文件大小最大限制,默认2M
  34. // uploadDir: 可以填写一个路径,不填默认为 os.tmpDir()
  35. }
  36. })
  37. )
  38. // 将 x-access-token 转换为 Authorization 请求头(兼容x-access-token)
  39. app.use(async (ctx, next) => {
  40. if (ctx.headers['x-access-token']) {
  41. // 如果 x-access-token 存在,转换为 Authorization: Bearer <token>
  42. ctx.headers['authorization'] = 'Bearer ' + ctx.headers['x-access-token'];
  43. delete ctx.headers['x-access-token']; // 删除原来的 x-access-token
  44. }
  45. await next();
  46. })
  47. // 将get请求的query解析到body
  48. app.use(async (ctx, next) => {
  49. if (ctx.request.method === 'GET') {
  50. const parsedQuery = qs.parse(ctx.querystring); // 使用 qs 库解析查询字符串
  51. console.log("ctx.querystring: ", ctx.querystring)
  52. console.log("parsedQuery: ", parsedQuery)
  53. ctx.request.body = parsedQuery;
  54. }
  55. console.log("ctx.request.body: ", ctx.request.body)
  56. await next();
  57. })
  58. // 保护所有路由:使用 koa-jwt 中间件
  59. app.use(koaJwt({ secret: SECRET_KEY, key: 'jwtData' }).unless({
  60. path: [/^\/bee\/login$/, /^\/bee\/register$/] // 排除 /login 和 /register 路由
  61. }))
  62. app.use(zodErrorHandler({
  63. log: (error, ctx) => {
  64. logger.error({ Context: ctx }, `ZOD error : ${error.toString()}`)
  65. }
  66. }))
  67. app.use(i18n)
  68. app.use(router.routes()).use(router.allowedMethods())
  69. // 统一的错误处理
  70. app.on('app error', handleError)
  71. export default app