koa2学习笔记:统一接口返回数据格式,允许跨域设置
之前写的接口返回数据大都如下形式,包括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)