为了账号安全,请及时绑定邮箱和手机立即绑定

【金秋打卡】第19天 《Node.js+Koa2+MySQL 打造前后端分离精品项目》

课程名称:Node.js+Koa2+MySQL打造前后端分离精品项目《旧岛》

课程章节:第5章 LinValidator校验器与Sequelize Orm生成MySQL数据表

视频:5-3 配置文件与在终端显示异常

课程讲师: 七月

课程内容:

在PositiveIntergerValidator中,如果没有supre(),则不符合javascript语法,当调用this时,之前必须要调用supre()。 这时出错但没有报错异常信息。最好的方法是看到具体的异常信息。

const { HttpException } = require("../core/http-exception")

const catchErrof = async (ctx, next) => {
    try {
        await next()
    } catch (error) {
        throw error    //注意这里直接抛出异常
        if (error instanceof HttpException) {
            ctx.body = {
                msg: error.msg,
                error_code: error.errorCode,
                request: `${ctx.method} ${ctx.path}`,
               
            }
            ctx.status = error.code
        }
        else {
            //处理未知异常
            ctx.body = {
                msg: '我们遇到了一个错误(未知异常) ~~~',
                error_code: 999,
                request: `${ctx.method} ${ctx.path}`
            }
            ctx.status = 500
        }
    }
}
module.exports = catchErrof
const { LinValidator, Rule } = require('../../core/lin-validator')

class PositiveIntegerValidator extends LinValidator {
    constructor() {
        //super()    //这里注释掉super()
        this.id = [
            new Rule('isInt', '需要是正整数', {min:1})
        ]
    }
}

module.exports = {
    PositiveIntegerValidator
}
使用Postman调用接口时,在终端窗口会直接打印出来异常信息。
 ReferenceError: Must call super constructor in derived class before accessing 'this' or returning from derived constructor
      at new PositiveIntegerValidator (D:\Koa2\island\app\validator\validator.js:6:3)
      at router.post (D:\Koa2\island\app\api\v1\classic.js:13:18)
      at dispatch (D:\Koa2\island\node_modules\koa-compose\index.js:42:32)
      at D:\Koa2\island\node_modules\koa-router\lib\router.js:425:16
      at dispatch (D:\Koa2\island\node_modules\koa-compose\index.js:42:32)
      at D:\Koa2\island\node_modules\koa-compose\index.js:34:12
      at dispatch (D:\Koa2\island\node_modules\koa-router\lib\router.js:430:31)
      at dispatch (D:\Koa2\island\node_modules\koa-compose\index.js:42:32)
      at dispatch (D:\Koa2\island\node_modules\koa-router\lib\router.js:399:32)
      at dispatch (D:\Koa2\island\node_modules\koa-compose\index.js:42:32)

开发环境有必要看到异常信息,生成环境没有必要看到异常信息。用配置文件可以解决。

//一个配置文件的例子
module.exports = {
    environment: 'dev'  //dev开发环境。 prod生成环境
}
//改动后的代码
const requireDirectory = require("require-directory");
const Router = require('koa-router')
class InitManager {

    //入口方法
    static initCore(app) {
        InitManager.app = app
        InitManager.initLoadRouters()  
        InitManager.loadHttpException()
        InitManager.loadConfig()
    }

    //注意这里的改动。
    static loadConfig(path = '') {
        const configPath = path || process.cwd() + '/config/config.js'
        const config = require(configPath)
        global.config = config
    }

    static initLoadRouters() {
        const apiDirectory = `${process.cwd()}/app/api`
        requireDirectory(module, apiDirectory, {
            visit: whenLoadModule
        })

        function whenLoadModule(obj) {
            if (obj instanceof Router) {
                InitManager.app.use(obj.routes())
            }
        }
    }

    static loadHttpException() {
        const errors = require('./http-exception')
        global.errs = errors
    }
}

module.exports = InitManager
const { HttpException } = require("../core/http-exception")

const catchErrof = async (ctx, next) => {
    try {
        await next()
    } catch (error) {
        //注意这里的改动。
        if (global.config.environment === 'dev') {
            throw error
        }
        if (error instanceof HttpException) {
            ctx.body = {
                msg: error.msg,
                error_code: error.errorCode,
                request: `${ctx.method} ${ctx.path}`,
               
            }
            ctx.status = error.code
        }
        else {
            //处理未知异常
            ctx.body = {
                msg: '我们遇到了一个错误(未知异常) ~~~',
                error_code: 999,
                request: `${ctx.method} ${ctx.path}`
            }
            ctx.status = 500
        }
    }
}
module.exports = catchErrof

课程收获:

这节课讲了使用配置文件来区分当前是开发环境还是线上生成环境的这种方法。 在ThinkPHP中也有类似的设计,env文件是否存在或者env文件中的标记,就能区分当前是开发环境还是生产环境。看来不同的语言确实有想通的地方。


七月老师非常注重在讲编程知识的同时,讲编程思维,讲知识和知识之间的关系。编程是实践性非常强的工作,学习知识最好的方法是放到项目中。做项目的目的不是做项目,最终要做出来自己的项目,业务承载的是编程知识。明天继续刷后边的课程。

https://img1.sycdn.imooc.com//636e643d00015ae610280635.jpg

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消