node项目错误处理与日志

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

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

使用 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项目错误处理与日志》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

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

How Great Decisions Get Made

How Great Decisions Get Made

Maruska, Don / 2006-2 / $ 20.28

All too often, solving tough work issues can become a tug of war as clashing departments, priorities, personality styles, and other concerns threaten to destroy any possibility of a successful conclus......一起来看看 《How Great Decisions Get Made》 这本书的介绍吧!

SHA 加密
SHA 加密

SHA 加密工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具