• 学习koa开发API(五)--- 对异常和参数的处理


    最近看了日漫《强风吹拂》,啊啊啊看的我开心,好久没好好看日漫了,找到了一种失去好久的的那种“中二”拼劲!!

    KOA自带的错误处理

    • 当我们输入一个不存在的接口路径时status是404;
    • 当我们手动抛出ctx.throw(412)时,status是412,且显示的是Precondition Failed,可以在抛出的时候写上异常信息ctx.throw(412,'我是错误信息');;
    • console.log(a.b)这一行代码由于a变量未定义,导致status是500。

    认识koa-json-error

    cnpm i koa-json-error --save
    
    const Koa = require('koa');
    const app = new Koa();
    const error = require("koa-json-error");
    const routing = require('./routes');
    
    app.use(error());
    // router注册到app
    routing(app);
    
    app.listen(3000);
    

    当返回的接口status是412时,返回的内容是:

    {
        "message": "我是错误信息",
        "name": "PreconditionFailedError",
        "stack": "PreconditionFailedError: 我是错误信息
        at Object.throw (E:\code\project\node\...)..."
        "status": 412
    }
    

    当调用了未定义a的接口的时候,返回的内容是:

    {
        "name": "ReferenceError",
        "message": "a is not defined",
        "stack": "ReferenceError: a is not defined
        at get (E:\code\project\node\...",
        "status": 500
    }
    

    当访问不存的接口的时候:

    {
        "message": "Not Found",
        "name": "NotFoundError",
        "stack": "NotFoundError: Not Found
        at Object.throw (E:\code\project\node\...",
        "status": 404
    }
    

    stack中的内容有助于我们在开发阶段改BUG,当上线后将stack的内容暴露给用户并不好,于是我们修改一下:

    app.use(error({
      // e 是koa原生返回的error
      postFormat:( e, 
        {stack,...rest})=>process.env.NODE_ENV === 'production'
        ? rest : {stack,...rest}
    }));
    

    windows环境安装

    cnpm i cross-env --save-dev
    

    修改package.json

    "start": "cross-env NODE_ENV=production nodemon app/index.js",
    "dev": "nodemon app/index.js"
    

    执行npm start即生产环境,返回的结果不会返回stack的内容,而npm run dev就会返回。

    使用koa-parameter 校验参数

    在调用某些api的时候我们需要传递一些参数,我们需要对这些参数进行校验。

    cnpm i koa-parameter  --save
    
    // index.js
    const parameter = require("koa-parameter");
    app.use(parameter(app));
    
    // controllers/book.js
    class BookCtl {
      get(ctx){
        ctx.verifyParams({
          id:{type:'string',required:true}
        })
        ctx.body = '<h1>获得一本图书</h1>';
      }
    }
    module.exports = new BookCtl();
    
  • 相关阅读:
    我知道开发已经接近于成功了
    反射获取运行时属性值的替代方法
    Fix Visual Studio 2013 Razor CSHTML Intellisense in Class Library or Console Application
    领域模型
    UI设计心得
    ADO.NET EF 中的实体修改方法
    .net与com组件
    win8设置开机启动项
    编程架构
    禁止UITextField 使用粘贴复制功能
  • 原文地址:https://www.cnblogs.com/armouy/p/12253171.html
Copyright © 2020-2023  润新知