}
log4js.configure({
appenders: {
console: { type: 'console' },
dateFile: { type: 'dateFile', filename: config.logPath, pattern: '-yyyy-MM-dd' }
},
categories: {
default: {
appenders: ['console', 'dateFile'],
level: 'info'
}
}
})
const logger = log4js.getLogger('[Default]')
const loggerMiddleware = async (ctx, next) => {
const start = new Date()
await next()
const ms = new Date() - start
const remoteAddress = ctx.headers['x-forwarded-for'] || ctx.ip || ctx.ips ||
(ctx.socket && (ctx.socket.remoteAddress || (ctx.socket.socket && ctx.socket.socket.remoteAddress)))
let logText = `${ctx.method} ${ctx.status} ${ctx.url} 请求参数: ${JSON.stringify(ctx.request.body)} 响应参数: ${JSON.stringify(ctx.body)} - ${remoteAddress} - ${ms}ms`
logger.info(logText)
}
module.exports = {
logger,
loggerMiddleware
}
response.js
这个中间件主要是用来对返回前端的响应进行处理,基础的koa模板中,我们可以用
ctx.body 进行返回前端,但是发现有些东西经常重复写,还不如提出来进行封装,而且还不用担心返回的格式会不一致。 先看看代码:
'use strict'const { logger } = require('./logger')
// 这个middleware用于将ctx.result中的内容最终回传给客户端
// 回传的格式遵循这样的格式:{ code: 0, msg: any data: any }
const responseHandler = (ctx) => {
if (ctx.result !== undefined) {
ctx.type = 'json'
ctx.body = {
code: 200,
msg: ctx.msg || '',
data: ctx.result
}
}
}
// 这个middleware处理在其它middleware中出现的异常
// 并将异常消息回传给客户端:{ code: '错误代码', msg: '错误信息' }
const errorHandler = (ctx, next) => {
return next().catch(err => {
if (err.code == null) {
logger.error(err.stack)
}
ctx.body = {
code: err.code || -1,
data: null,
msg: err.message.trim()
}
ctx.status = 200 // 保证返回状态是 200, 这样前端不会抛出异常
return Promise.resolve()
})
}
module.exports = {
responseHandler,
errorHandler
}
代码的后面会暴露出
responseHandler 和
errorHandler ,
responseHandler 正确响应,我们在业务中,只需要对
ctx.result 进行写入即可。这个中间件可以放在所有中间件的最后面,这样可以保证前面中间件都需要经过它,再返回前端。
errorHandler 错误响应,这个主要是用来进行出错或者异常的捕获,可以返回响应给前端,要不前端会出现一直padding的状态直到超时。









