统一接口成功或失败返回格式
之前写的接口返回数据大都如下形式,包括3个字段:code、data、msg,希望每个api接口都能以如下形式返回数据,利用中间件就非常容易实现//成功返回
{
"code":200,
"msg":"success",
"data":{
"items":[]
}
}
//失败返回
{
"code":99,
"msg":"参数不完整"
}
我们先从如果调用,倒推我们如何实现这个中间件
我们期望在路由中通过 ctx.success(data) 或 ctx.fail(msg,code) 这两种形式返回数据,也就是我们要给ctx添加success和fail函数,中间件的功能就很明确了router.get('/',ctx=>{
//期望在api中通过如下方式返回数据
ctx.success({
items:[]
})
})
我们来实现这个中间件,命名为routerResponse,可以接收参数对象option,设置默认的返回数据类型(默认json形式返回)、成功失败code和msgfunction routerResponse(option={}){
return function(ctx,next){
ctx.success = function (data) {
ctx.type = option.type || 'json'
ctx.body = {
code : option.successCode || 200,
msg : option.successMsg || 'success',
data : data
}
}
ctx.fail = function (msg,code) {
ctx.type = option.type || 'json'
ctx.body = {
code : code || option.failCode || 99,
msg : msg || option.successMsg || 'fail',
}
}
next()
}
}
module.exports= routerResponse
在app.js中引用这个中间件const Koa = require('koa')
const app = new Koa()
let routerResponse = require('./middleware/routerResponse')
...
app.use(routerResponse())
...
app.listen(3031)
允许跨域设置
由于浏览器同源策略限制,默认js是不能跨域访问接口的,需要我们在api中进行设置,允许跨域访问,这也非常适合在app.js中通过中间件进行统一设置。
一个简单的跨域设置中间件如下,我们可以配置允许跨域的域名、访问方法、header及是否跨域携带cookiemodule.exports = function (options) {
return async (ctx,next)=>{
ctx.set('Access-Control-Allow-Origin', options.allowOrigin.join(','))
ctx.set('Access-Control-Allow-Methods', options.allowMethods.join(','))
ctx.set('Access-Control-Allow-Headers', options.allowHeaders.join(','))
ctx.set('Access-Control-Allow-Credentials', options.allowCredentials);
next()
}
}
在app.js中引入该中间件,其中跨域设置中间件要在router中间件前面,否则会无效。const Koa = require('koa')
const app = new Koa()
let composeRouter = require('./middleware/composeRouter')
let routerResponse = require('./middleware/routerResponse')
let cors = require('./middleware/cors') //跨域设置中间件
app.use(routerResponse())
//跨域设置
app.use(cors({
allowOrigin:['http://localhost:63343'],
allowMethods:[],
allowHeaders:[]
}))
app.use(composeRouter(__dirname + '/controllers').routes());
app.listen(3031)
我们可以通过koa2-cors中间件来设置更详细的跨域配置项,可github搜索