node项目错误处理与日志

栏目: JavaScript · 发布时间: 5年前

内容简介:使用直接把代码写在在

使用 captureStackTrace 方法加入自带的错误信息

// Error对象自带的属性
Error.captureStackTrace

// 如何使用captureStackTrace
var obj = {
	message: 'something is wrong'
}

Error.captureStackTrace(obj)

throw obj	// 此时会抛出obj对象的message内信息
复制代码

使用try catch捕获错误

直接把代码写在 try catch 中即可捕获错误信息

try{
    throw new Error('oh no')
}catch(e){
	console.log(e)
}
复制代码

异步 代码中,直接try catch是无法捕获错误信息的,可以使用如下方法

function foo(params, cb){
    const error = new Error('something is wrong')
    if(error) cb(error)
}
复制代码

以上使用 callback 方式来做错误处理比较容易麻烦,容易出错,现在node已经支持 async await 所以尽量使用它们准没错

async function foo(){
    try{
        await bar()
    }catch(e){
        console.log(e)
    }
}

async function bar(){
    throw new Error('async function got wrong)
}

foo()
复制代码

基本错误类型

在项目会有多个地方对错误信息进行处理,所以先写一个 基本错误 类型,方便使用

// 基本错误类型
class HttpBaseError extends Error {
  constructor(httpStatusCode, httpMsg, errCode, msg) {
    super(`HTTP ERROR: ${msg}`);
    this.httpStatusCode = httpStatusCode;
    this.httpMsg = httpMsg;
    this.errCode = errCode;
  }
}

try {
// 直接抛出定义好的错误即可
  throw new HttpBaseError(404, '资源不存在', 10000, 'resouse is not found');
} catch (e) {
  console.log(e.message);
  console.log(e.httpStatusCode);
  console.log(e.httpMsg);
  console.log(e.errCode);
}
复制代码

特定错误类型

除了基本类型,不同情况下会有不同错误信息,需要用一个 特定 的错误类型来处理特定的错误信息

// 一个参数错误类型
const ERROR_CODE = 40000	// 错误码
class HttpRequestParamError extends HttpBaseError {
    constructor(paramName, desc, msg) {
        super(200, desc, ERROR_CODE, `${paramName} wrong: ${msg}`)
    }
}
复制代码

这样,在参数错误的地方就能非常方便的调用这个错误类型来返回错误

抛错的逻辑

错误处理中,model,controller中的错误,有些是不能直接返回给用户的,应该只返回给model或controller的调用者。

使用错误处理

正常接口,controller,model的错误,使用设定好的错误类型进行处理,例如前面写的 HttpRequestParamError ,在所有所有路由的最后,需要使用一个error handler来对所有的错误进行 集中处理

// error handler
function handler(options) {
    return function (err, req, res, next) {
        if (err instanceof HttpRequestParamError) {	// 这里对不同的错误做不同的处理
            console.log('http request error')
            res.statusCode = err.httpStatusCode
            res.json({
                code: err.errCode,
                msg: err.httpMsg
            })
        } else {
            // 设定之外的错误,把管理权向外移交
            next(err)
        }
    }
}
复制代码

除了可预知的错误,还有未知的类型的错误,此时需要一个unknow error handler进行剩余错误的处理

function unKnowErrorHandler(options) {
    return function (err, req, res, next) {
        console.log(err)
        res.json({
            code: 99999,
            msg: 'unKnow error'
        })
    }
}
复制代码

node中的日志

平时使用console来debug是没有问题的,但是在线上环境,我们并不能有效的看到console,使用日志系统可以更好的方便线上的debug,记录信息等

winston的使用

winston 是node中常用的日志插件

const winston = require('winston')

const logger = winston.createLogger({
    transports: [
        new winston.transports.Console(),
        new winston.transports.File({
            name: 'info_logger',	// log名称
            filename: 'logs/info.log',	// 日志记录文件地址
            level: 'info' // 设置log的类型
        }),
        // 第二个logger,记录error级别的log
        new winston.transports.File({
            name: 'error_logger',
            filename: 'logs/error.log',
            level: 'error'
        })
    ]
});

// error级别比info要高,error.log文件只会记录error日志
logger.error('first error log with winston')
// info文件内会记录info级别的log和比info级别高的log,比如error
logger.info('first info log with winston')
复制代码

日志滚动(log rotation)

在产生大量数据的应用当中,日志的输出是大量的,这是就需要对日志进行 拆分 处理,例如按照每天的频率来分别记录日志。

winston并不自带log rotation,需要引入 winston-daily-rotate-file

const {
    createLogger,
    format,
    transports
} = require('winston');
const {
    combine,
    timestamp,
    label,
    prettyPrint
} = format;
require('winston-daily-rotate-file')


var transport = new(transports.DailyRotateFile)({
    filename: './logs/app-%DATE%.log',
    datePattern: 'YYYY-MM-DD-HH',
    maxSize: '20m',
    maxFiles: '14d',
    format: combine(
        label({
            label: 'right meow!'
        }),
        timestamp(),
        prettyPrint()
    ),
});
transport.on('rotate', function (oldFilename, newFilename) {});

var logger = createLogger({
    transports: [
        transport
    ]
});

logger.info('Hello World!');
复制代码

运行日志文件,此时在logs目录下就生成了今天的日志

欢迎访问我的博客


以上所述就是小编给大家介绍的《node项目错误处理与日志》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

计算的本质

计算的本质

[英] Tom Stuart / 张伟 / 人民邮电出版社 / 2014-11 / 69.00元

《计算的本质:深入剖析程序和计算机》借助Ruby全面介绍计算理论和编程语言的设计。作者注重实用性,不仅尽量抛开复杂难懂的数学符号,而且特别选用简单快捷的编程语言Ruby,在读者熟知的背景知识下,以明晰的可工作代码阐明形式语义、自动机理论,以及通过lambda演算进行函数式编程等计算机科学知识,并为让其自行探索做足准备。 本书适合计算机科学系学生,以及熟知现代编程语言,想要系统地学习计算机科学......一起来看看 《计算的本质》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试