| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- 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<object>({ request: ctx.request }, 'Request received.')
- await next()
- logger.debug<object>({ 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 <token>
- 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
|