import _ from 'lodash'; import APIException from '@/lib/exceptions/APIException.ts'; import EX from '@/api/consts/exceptions.ts'; import logger from '@/lib/logger.ts'; import util from '@/lib/util.ts'; export interface RequestOptions { time?: number; } export default class Request { /** 请求方法 */ method: string; /** 请求URL */ url: string; /** 请求路径 */ path: string; /** 请求载荷类型 */ type: string; /** 请求headers */ headers: any; /** 请求原始查询字符串 */ search: string; /** 请求查询参数 */ query: any; /** 请求URL参数 */ params: any; /** 请求载荷 */ body: any; /** 上传的文件 */ files: any[]; /** 客户端IP地址 */ remoteIP: string | null; /** 请求接受时间戳(毫秒) */ time: number; constructor(ctx, options: RequestOptions = {}) { const { time } = options; this.method = ctx.request.method; this.url = ctx.request.url; this.path = ctx.request.path; this.type = ctx.request.type; this.headers = ctx.request.headers || {}; this.search = ctx.request.search; this.query = ctx.query || {}; this.params = ctx.params || {}; this.body = ctx.request.body || {}; this.files = ctx.request.files || {}; this.remoteIP = this.headers["X-Real-IP"] || this.headers["x-real-ip"] || this.headers["X-Forwarded-For"] || this.headers["x-forwarded-for"] || ctx.ip || null; this.time = Number(_.defaultTo(time, util.timestamp())); } validate(key: string, fn?: Function) { try { const value = _.get(this, key); if (fn) { if (fn(value) === false) throw `[Mismatch] -> ${fn}`; } else if (_.isUndefined(value)) throw '[Undefined]'; } catch (err) { logger.warn(`Params ${key} invalid:`, err); throw new APIException(EX.API_REQUEST_PARAMS_INVALID, `Params ${key} invalid`); } return this; } }