H5W3
当前位置:H5W3 > 其他技术问题 > 正文

【Web前端问题】koa里如何设置统一的返回状态码?

1.本人新手,看了好多文档,用koa2+koa-generator+monogoDB搭建了个demo,试图去写一些简单的接口。
但是问题来了,如何统一设置返回的格式呢?或者我的项目目录需要如何设置,结构需要怎么样的优化?

目前的目录:

图片描述

2.例如:查询用户的接口,代码如下

const router = require('koa-router')()
const db = require('monk')('127.0.0.1:27017/test1') //中间件连接数据库

router.prefix('/queryUsers') //接口前缀

let table1Data = db.get('table1');  
router.get('/', async function (ctx, next) {
    let getParams = ctx.request.query;
    ctx.response.type = 'application/json';
    if(getParams._id){
        ctx.body = {
            code:200,
            msg:"success",
            content:await table1Data.find({_id:getParams._id})
        }
    }else {
        ctx.body = {
            code:0,
            msg:"error",
            content:'参数错误'
        }    
    }
})

module.exports = router

3.通过get请求可以查询到数据,但是如何统一设置返回的格式呢?
总不能每个接口都单独这样写:

if(getParams._id){
    ctx.body = {
        code:200,
        msg:"success",
        content:await table1Data.find({_id:getParams._id})
    }
}else {
    ctx.body = {
        code:0,
        msg:"error",
        content:'参数错误'
    }    
}

4.或者有没有其他的优化建议。蟹蟹各位大佬

回答:

封装一个额外组件,我这边刚好写一个类似的。

let responseBeautifier = new class{
    constructor(){
        this.response = {
            code:"",
            data:{},
            msg:""
        },
        this.StatusCode = new Map();
        this.registeStatusCode("0","OK");
        this.registeStatusCode("-1","ERROR");
    }
    registeStatusCode(code,description){
        this.StatusCode.set(code,description);
    }
    registeStatusCodes(arr){
        for(let [code,description] of arr){
            this.StatusCode.set(code,description);
        }
    }
    set(data,code="0",msg){
        code = code.toString()
        if(this.StatusCode.has(code)){
            return {
                code,
                data,
                msg:this.StatusCode.get(code),
            }
        }else{
            // log Something ,here is an unique code
            return {
                code,
                data,
                msg:msg||"Unresolvable Status Code :"+code,
            }
        }
    }
    error(code="-1",msg){
        code = code.toString()
        if(this.StatusCode.has(code)){
            return {
                code,
                data:{},
                msg:this.StatusCode.get(code),
            }
        }else{
            // log Something ,here is an unique code
            return {
                code,
                data:{},
                msg:msg||"Unresolvable Status Code :"+code,
            }
        }
    }
}();

//registe Status Code 

responseBeautifier.registeStatusCodes([
    ["404","NtFound"], 
    ["200","success"],
    ["1","等待中"],
])


export default responseBeautifier;

使用的时候,code想用number也行,自己重新用数组重新封装一下,问题不大,在编程的时候,可以随时到这个文件注册新的返回码和解释。

使用的时候只需要import R from responseBeautifier,
用R.set(data)即可获得返回的数据结构了

controller怎么设置还是看你自己。

其实这个reponseBeautifier还比较简单,有特殊需求也可以写一个完整结构,每次需要的时候创建一个新对象可能更好,比较符合ctx.body的设定

回答:

统一返回格式换句话说就是有一个返回格式类或处理函数。比如我可以在之前加个中间件定义一个ctx.state.success的方法,然后ctx.state.success(content),方式都差不多。

本文地址:H5W3 » 【Web前端问题】koa里如何设置统一的返回状态码?

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址