欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Nodejs中獲取當(dāng)前函數(shù)被調(diào)用的行數(shù)及文件名詳解

 更新時(shí)間:2018年12月12日 11:44:19   作者:蘇格團(tuán)隊(duì)  
這篇文章主要給大家介紹了關(guān)于Nodejs中獲取當(dāng)前函數(shù)被調(diào)用的行數(shù)及文件名的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

背景

自定義Egg.js的請求級別日志這篇文章中,我們實(shí)現(xiàn)了自定義請求級別的日志模塊??瓷先スδ苁峭暾?,但好像還缺點(diǎn)什么。

大家在根據(jù)日志追查問題的過程中,很多時(shí)候看到了某條log信息想去找出處,但是實(shí)際上代碼里面打相同類型的log地方可能不止一處,這時(shí)你就比較難去定位這行l(wèi)og到底是哪里打的。

舉個(gè)最極端的例子

//home.js
class AppController extends app.Controller {
 async first() {
 this.ctx.swLog.info('in controller');
 await this.ctx.render('first.html');
 }
 
 async second(){
 this.ctx.swLog.info('in controller')
 await this.ctx.render('second.html');
 }
}

上面的例子雖然比較極端,但是我們在代碼中難免會(huì)碰到類似的情況。兩個(gè)route對于的controller中都打印了相同的log,你在查日志的時(shí)候,是無法區(qū)分log到底是first里面打的還是second里面打的。
這個(gè)時(shí)候,我們就需要在日志打印的時(shí)候,同時(shí)也將調(diào)用日志時(shí)的文件名和代碼行數(shù)記錄下來一并打印,效果如下

[2018-11-02 19:25:09.665][22896][home.js:4][/] in controller

開始動(dòng)手

查了很久的Nodejs文檔,發(fā)現(xiàn)Nodejs的api中并沒有直接提供我們想到的信息,所以只能另找出路。
回憶我們以往的開發(fā),這類的信息好像只有在Nodejs拋出異常的時(shí)候看到過。每當(dāng)Nodejs拋出異常時(shí),我們都能看到一堆異常調(diào)用的堆棧,里面就有我們想要的信息,我們從這開始入手。
我們先手動(dòng)創(chuàng)造一個(gè)異常對象,并打印出來

function getException() {
 try {
 throw Error('');
 } catch (err) {
 return err;
 }
}
 
let err = getException();
console.log(err);

console的信息如下圖:

在圖上我們可以看到,我們想要的信息

err對象在console的時(shí)候,會(huì)直接輸出err對象中的stack屬性,該屬性是個(gè)字符串,我們可以通過一系列的字符串操作,拿到我們想要的文件名和行數(shù)。

接下來我們開始對日志模塊代碼進(jìn)行改造,新增一個(gè)getCallerFileNameAndLine方法,如下:

getCallerFileNameAndLine(){
 function getException() {
  try {
  throw Error('');
  } catch (err) {
  return err;
  }
 }
 
 const err = getException();

 const stack = err.stack;
 const stackArr = stack.split('\n');
 let callerLogIndex = 0;
 for (let i = 0; i < stackArr.length; i++) {
 if (stackArr[i].indexOf('Map.Logger') > 0 && i + 1 < stackArr.length) {
  callerLogIndex = i + 1;
  break;
 }
 }

 if (callerLogIndex !== 0) {
 const callerStackLine = stackArr[callerLogIndex];
 return `[${callerStackLine.substring(callerStackLine.lastIndexOf(path.sep) + 1, callerStackLine.lastIndexOf(':'))}]`;
 } else {
 return '[-]';
 }
}

最終結(jié)果

最后我們每條打印的日志后面,都會(huì)跟上文件名和行數(shù)

有的同學(xué)可能擔(dān)心,每次打log都拋一個(gè)異常,會(huì)不會(huì)對性能造成影響。
我在getCallerFileNameAndLine方法前后進(jìn)行打點(diǎn)統(tǒng)計(jì),平均執(zhí)行時(shí)間在2ms左右,所以是可以忽略不計(jì)的。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • Linux使用Node.js建立訪問靜態(tài)網(wǎng)頁的服務(wù)實(shí)例詳解

    Linux使用Node.js建立訪問靜態(tài)網(wǎng)頁的服務(wù)實(shí)例詳解

    這篇文章主要介紹了Linux使用Node.js建立訪問靜態(tài)網(wǎng)頁的服務(wù)實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • Nodejs 中文分詞常用模塊用法分析

    Nodejs 中文分詞常用模塊用法分析

    這篇文章主要介紹了Nodejs 中文分詞常用模塊用法,結(jié)合具體案例形式分析了node.js常用分詞模塊的基本功能、用法、效率與相關(guān)使用特點(diǎn),需要的朋友可以參考下
    2023-05-05
  • 淺談Node.js之異步流控制

    淺談Node.js之異步流控制

    本篇文章主要介紹了淺談Node.js之異步流控制,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-10-10
  • Node.js  事件循環(huán)詳解及實(shí)例

    Node.js 事件循環(huán)詳解及實(shí)例

    這篇文章主要介紹了 Node.js 事件循環(huán)詳解及實(shí)例的相關(guān)資料,Node.js 有多個(gè)內(nèi)置的事件,我們可以通過引入 events 模塊,并通過實(shí)例化 EventEmitter 類來綁定和監(jiān)聽事件,需要的朋友可以參考下
    2017-08-08
  • node.js express框架實(shí)現(xiàn)文件上傳與下載功能實(shí)例詳解

    node.js express框架實(shí)現(xiàn)文件上傳與下載功能實(shí)例詳解

    這篇文章主要介紹了node.js express框架實(shí)現(xiàn)文件上傳與下載功能,結(jié)合具體實(shí)例形式詳細(xì)分析了node.js express框架針對文件上傳與下載的前后臺(tái)相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2019-10-10
  • nodeJs爬蟲獲取數(shù)據(jù)簡單實(shí)現(xiàn)代碼

    nodeJs爬蟲獲取數(shù)據(jù)簡單實(shí)現(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了nodeJs爬蟲獲取數(shù)據(jù)簡單實(shí)現(xiàn)代碼,感興趣的小伙伴們可以參考一下
    2016-03-03
  • Node.JS中快速掃描端口并發(fā)現(xiàn)局域網(wǎng)內(nèi)的Web服務(wù)器地址(80)

    Node.JS中快速掃描端口并發(fā)現(xiàn)局域網(wǎng)內(nèi)的Web服務(wù)器地址(80)

    在 Node.JS 中進(jìn)行端口掃描還是比較方便的,一般會(huì)有廣播和輪詢兩種方式。下文重點(diǎn)給大家介紹node.js 掃描端口并發(fā)現(xiàn)局域網(wǎng)內(nèi)的web服務(wù)器地址的方法,一起看看吧
    2017-09-09
  • Windows系統(tǒng)下Node.js安裝以及環(huán)境配置的完美教程

    Windows系統(tǒng)下Node.js安裝以及環(huán)境配置的完美教程

    相信對于很多關(guān)注javascript發(fā)展的同學(xué)來說,nodejs已經(jīng)不是一個(gè)陌生的詞眼,下面這篇文章主要給大家介紹了關(guān)于Windows系統(tǒng)下Node.js安裝以及環(huán)境配置的完美教程,需要的朋友可以參考下
    2022-06-06
  • Node.js?與并發(fā)模型的詳細(xì)介紹

    Node.js?與并發(fā)模型的詳細(xì)介紹

    這篇文章主要介紹了Node.js?與并發(fā)模型的詳細(xì)介紹,Node.js?現(xiàn)在已成為構(gòu)建高并發(fā)網(wǎng)絡(luò)應(yīng)用服務(wù)工具箱中的一員,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,需要的朋友可以參考一下
    2022-07-07
  • pnpm的安裝和使用指南(推薦!)

    pnpm的安裝和使用指南(推薦!)

    如果你覺得npm比較慢,又不想用yarn,那么pnpm是一個(gè)很好的選擇,下面這篇文章主要給大家介紹了關(guān)于pnpm的安裝和使用的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-05-05

最新評論