koa2学习笔记:统一接口返回数据格式,允许跨域设置

蛰伏已久 蛰伏已久 2019-09-11

统一接口成功或失败返回格式

之前写的接口返回数据大都如下形式,包括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和msg

function 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及是否跨域携带cookie

module.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搜索


分享到

点赞(3)