正常接口,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)({









