import koa from 'koa' import { koaBody } from 'koa-body' import koaJwt from 'koa-jwt' import { SECRET_KEY } from '@/utils/jwt' import cors from 'koa2-cors' import logger, { koaLoggerMiddleware } from '@/logger' import i18n from '@/utils/i18next' import { zodErrorHandler } from 'koa-zod-errorhandler' import qs from 'qs' // import BullBoard from '@/queue/board.queue' import router from '@/router' import handleError from '@/constant/err.type' // 暂时不需要使用到MQTT // import mqttClient from '@/utils/mqtt' const app = new koa() app.use(koaLoggerMiddleware) // 打印每次收到的请求和回复的消息 app.use(async (ctx, next) => { logger.debug({ request: ctx.request }, 'Request received.') await next() logger.debug({ response: ctx.response }, 'Response Information.') }) // 不支持打包,暂时屏蔽 // app.use(BullBoard.registerPlugin()) app.use(cors({ origin: '*', // 允许所有来源访问 allowMethods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'], // 允许的方法 allowHeaders: ['Origin', 'X-Requested-With', 'Content-Type', 'Accept', 'Authorization'], // 允许的请求头 })) app.use( koaBody({ multipart: true, //解析多个文件 formidable: { maxFileSize: 10 * 1024 * 1024, // 设置上传文件大小最大限制,默认2M // uploadDir: 可以填写一个路径,不填默认为 os.tmpDir() } }) ) // 将 x-access-token 转换为 Authorization 请求头(兼容x-access-token) app.use(async (ctx, next) => { if (ctx.headers['x-access-token']) { // 如果 x-access-token 存在,转换为 Authorization: Bearer ctx.headers['authorization'] = 'Bearer ' + ctx.headers['x-access-token']; delete ctx.headers['x-access-token']; // 删除原来的 x-access-token } await next(); }) // 将get请求的query解析到body app.use(async (ctx, next) => { if (ctx.request.method === 'GET') { const parsedQuery = qs.parse(ctx.querystring); // 使用 qs 库解析查询字符串 console.log("ctx.querystring: ", ctx.querystring) console.log("parsedQuery: ", parsedQuery) ctx.request.body = parsedQuery; } console.log("ctx.request.body: ", ctx.request.body) await next(); }) // 保护所有路由:使用 koa-jwt 中间件 app.use(koaJwt({ secret: SECRET_KEY, key: 'jwtData' }).unless({ path: [/^\/bee\/login$/, /^\/bee\/register$/] // 排除 /login 和 /register 路由 })) app.use(zodErrorHandler({ log: (error, ctx) => { logger.error({ Context: ctx }, `ZOD error : ${error.toString()}`) } })) app.use(i18n) app.use(router.routes()).use(router.allowedMethods()) // 统一的错误处理 app.on('app error', handleError) export default app