koa 接口返回数据_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和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搜索

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个koa配置swagger接口的示例,包含增删改查操作: ```javascript const Koa = require('koa'); const Router = require('koa-router'); const swagger = require('swagger2'); const { validate } = require('swagger2-koa'); const bodyparser = require('koa-bodyparser'); const app = new Koa(); const router = new Router(); const spec = swagger.loadDocumentSync('./swagger.yaml'); if (!swagger.validateDocument(spec)) { throw Error(`./swagger.yaml does not conform to the Swagger 2.0 schema`); } router.get('/users', async (ctx) => { // 查询用户列表 const users = await User.find(); ctx.status = 200; ctx.body = { users }; }); router.get('/users/:id', async (ctx) => { // 查询单个用户 const user = await User.findById(ctx.params.id); if (!user) { ctx.status = 404; ctx.body = { error: 'User not found' }; } else { ctx.status = 200; ctx.body = { user }; } }); router.post('/users', async (ctx) => { // 创建用户 const user = await User.create(ctx.request.body); ctx.status = 201; ctx.body = { user }; }); router.put('/users/:id', async (ctx) => { // 更新用户 const user = await User.findByIdAndUpdate(ctx.params.id, ctx.request.body, { new: true }); if (!user) { ctx.status = 404; ctx.body = { error: 'User not found' }; } else { ctx.status = 200; ctx.body = { user }; } }); router.delete('/users/:id', async (ctx) => { // 删除用户 const user = await User.findByIdAndDelete(ctx.params.id); if (!user) { ctx.status = 404; ctx.body = { error: 'User not found' }; } else { ctx.status = 204; } }); app.use(bodyparser()); app.use(validate(spec)); app.use(router.routes()); app.use(router.allowedMethods()); app.listen(3000, () => { console.log('Server running on http://localhost:3000'); }); ``` 以上示例中,我们通过koa-router来定义了5个接口: - 查询用户列表:GET /users - 查询单个用户:GET /users/:id - 创建用户:POST /users - 更新用户:PUT /users/:id - 删除用户:DELETE /users/:id 在每个接口的处理函数中,我们使用了Mongoose来进行数据库操作。返回数据都被包装在了一个对象中,以符合Swagger规范。 为了让这些接口符合Swagger规范,我们使用了swagger2-koa中间件来校验请求和响应的数据格式。同时,我们也编写了一个swagger.yaml文件来对接口进行定义和描述。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值