搭建一个Koa后端项目脚手架的方法步骤

2020-06-17 05:47:36易采站长站整理

}

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的状态直到超时。