最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

node錯誤處理與日志記錄的實現(xiàn)

 更新時間:2018年12月24日 11:15:25   作者:李諾  
這篇文章主要介紹了node錯誤處理與日志記錄的實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

node項目中的錯誤處理

node中Error對象的使用

使用captureStackTrace方法加入自帶的錯誤信息

// Error對象自帶的屬性
Error.captureStackTrace

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

Error.captureStackTrace(obj)

throw obj  // 此時會拋出obj對象的message內(nèi)信息

使用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方式來做錯誤處理比較容易麻煩,容易出錯,現(xiàn)在node已經(jīng)支持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);
}

特定錯誤類型

除了基本類型,不同情況下會有不同錯誤信息,需要用一個特定的錯誤類型來處理特定的錯誤信息

// 一個參數(shù)錯誤類型
const ERROR_CODE = 40000  // 錯誤碼
class HttpRequestParamError extends HttpBaseError {
  constructor(paramName, desc, msg) {
    super(200, desc, ERROR_CODE, `${paramName} wrong: ${msg}`)
  }
}

這樣,在參數(shù)錯誤的地方就能非常方便的調用這個錯誤類型來返回錯誤

拋錯的邏輯

錯誤處理中,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是沒有問題的,但是在線上環(huán)境,我們并不能有效的看到console,使用日志系統(tǒng)可以更好的方便線上的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文件內(nèi)會記錄info級別的log和比info級別高的log,比如error
logger.info('first info log with winston')

日志滾動(log rotation)

在產(chǎn)生大量數(shù)據(jù)的應用當中,日志的輸出是大量的,這是就需要對日志進行拆分處理,例如按照每天的頻率來分別記錄日志。

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目錄下就生成了今天的日志

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • 使用Node.js為其他程序編寫擴展的基本方法

    使用Node.js為其他程序編寫擴展的基本方法

    這篇文章主要介紹了使用Node.js為其他程序編寫擴展的基本方法 ,文中示例是通過Node讓JavaScript代碼與C++應用產(chǎn)生交互,需要的朋友可以參考下
    2015-06-06
  • 如何使用docker直接運行不同版本nodejs命令

    如何使用docker直接運行不同版本nodejs命令

    這篇文章主要介紹了如何使用docker直接運行不同版本nodejs命令,在不支持高版本Node.js的舊版操作系統(tǒng)上,可以通過Docker容器技術解決兼容性問題,需要的朋友可以參考下
    2024-10-10
  • Koa日志中間件封裝開發(fā)詳解

    Koa日志中間件封裝開發(fā)詳解

    這篇文章主要介紹了Koa日志中間件封裝開發(fā)詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-03-03
  • Node中文件斷點續(xù)傳原理和方法總結

    Node中文件斷點續(xù)傳原理和方法總結

    在之前做過一個小項目,涉及到了文件上傳,在大文件上面使用了斷點續(xù)傳,降低了服務器方面的壓力,現(xiàn)在小編把Node中文件斷點續(xù)傳原理和方法總結分享給大家,感興趣的朋友一起看看吧
    2022-01-01
  • Node 自動化部署的方法

    Node 自動化部署的方法

    本篇文章主要介紹了Node 自動化部署的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • NodeJS 文件夾拷貝以及刪除功能

    NodeJS 文件夾拷貝以及刪除功能

    這篇文章主要介紹了NodeJS 文件夾拷貝以及刪除功能,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-09-09
  • 使用ExcelJS快速處理Node.js爬蟲數(shù)據(jù)

    使用ExcelJS快速處理Node.js爬蟲數(shù)據(jù)

    Excel.js是一個強大的JavaScript庫,它提供了方法處理Excel文件,例如創(chuàng)建和編輯工作簿、讀取和寫入數(shù)據(jù)、處理行和列、設置樣式、導入和導出數(shù)據(jù)等,本文介紹使用ExcelJS快速處理Node.js爬蟲數(shù)據(jù)的方法,一起看看吧
    2024-01-01
  • Node.js中Koa2在控制臺輸出請求日志的方法示例

    Node.js中Koa2在控制臺輸出請求日志的方法示例

    這篇文章主要給大家介紹了關于Node.js中Koa2在控制臺輸出請求日志的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Node.js具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-05-05
  • 關于NodeJs和JAVA建立socket連接方式

    關于NodeJs和JAVA建立socket連接方式

    這篇文章主要介紹了關于NodeJs和JAVA建立socket連接方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • NodeJS如何實現(xiàn)同步的方法示例

    NodeJS如何實現(xiàn)同步的方法示例

    nodeJS最大的特點就是其異步操作,下面這篇文章主要給大家介紹了關于NodeJS如何實現(xiàn)同步的方法的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學習學習吧
    2018-08-08

最新評論

宁波市| 永福县| 呼图壁县| 云南省| 枣庄市| 西贡区| 子长县| 永城市| 南汇区| 莒南县| 彩票| 阿瓦提县| 津市市| 穆棱市| 杂多县| 晋城| 遵义市| 多伦县| 新河县| 石阡县| 子长县| 永嘉县| 阿尔山市| 长武县| 农安县| 丹寨县| 苏尼特左旗| 常熟市| 吉林省| 天长市| 阳城县| 河北区| 安宁市| 霍州市| 凤山市| 广灵县| 厦门市| 丰宁| 白玉县| 嘉义县| 通山县|