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

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

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

背景

自定義Egg.js的請求級別日志這篇文章中,我們實現(xiàn)了自定義請求級別的日志模塊??瓷先スδ苁峭暾耍孟襁€缺點什么。

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

舉個最極端的例子

//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');
 }
}

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

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

開始動手

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

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

console的信息如下圖:

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

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

接下來我們開始對日志模塊代碼進行改造,新增一個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 '[-]';
 }
}

最終結果

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

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

總結

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

相關文章

  • node-sass安裝失敗的原因與解決方法

    node-sass安裝失敗的原因與解決方法

    這篇文章主要給大家介紹了關于node-sass安裝失敗的原因與解決方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2017-09-09
  • node.js通過axios實現(xiàn)網(wǎng)絡請求的方法

    node.js通過axios實現(xiàn)網(wǎng)絡請求的方法

    下面小編就為大家分享一篇node.js通過axios實現(xiàn)網(wǎng)絡請求的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-03-03
  • 深入了解 Node的多進程服務實現(xiàn)

    深入了解 Node的多進程服務實現(xiàn)

    本文主要介紹了Node的多進程服務實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-06-06
  • pnpm的安裝及其使用教程(匯總)

    pnpm的安裝及其使用教程(匯總)

    pnpm是 Node.js 的替代包管理器,它是 npm 的直接替代品,速度更快、效率更高,它由 npm/yarn 衍生而來,但卻解決了 npm/yarn 內(nèi)部潛在的 bug,并且極大了地優(yōu)化了性能,本文給大家介紹pnpm的安裝及其使用,感興趣的朋友一起看看吧
    2023-12-12
  • 詳解如何在Node.js中使用中間件處理請求

    詳解如何在Node.js中使用中間件處理請求

    在Node.js中,處理中間件是處理HTTP請求和響應的一個常見方式,甚至扮演著至關重要的角色,本文將介紹如何在Node.js中使用中間件來處理請求,感興趣的可以了解下
    2025-02-02
  • 修改Nodejs內(nèi)置的npm默認配置路徑方法

    修改Nodejs內(nèi)置的npm默認配置路徑方法

    今天小編就為大家分享一篇修改Nodejs內(nèi)置的npm默認配置路徑方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • Node.js 數(shù)據(jù)加密傳輸淺析

    Node.js 數(shù)據(jù)加密傳輸淺析

    這篇文章主要給大家介紹的是Node.js數(shù)據(jù)加密傳輸,本文主要介紹的是明文傳輸,文中通過示例代碼介紹的很詳細,相信對于大家的理解和學習會很有幫助,有需要的朋友們下面來一起學習學習吧。
    2016-11-11
  • nodejs與瀏覽器中全局對象區(qū)別點總結

    nodejs與瀏覽器中全局對象區(qū)別點總結

    在本篇文章里小編給大家整理的是一篇關于nodejs與瀏覽器中全局對象區(qū)別點總結內(nèi)容,對此有需要的朋友們可以學習下。
    2021-12-12
  • vscode 調(diào)試 node.js的方法步驟

    vscode 調(diào)試 node.js的方法步驟

    這篇文章主要介紹了vscode 調(diào)試 node.js的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • Nodejs之Express中間件的分類介紹

    Nodejs之Express中間件的分類介紹

    這篇文章主要介紹了Nodejs之Express中間件的分類,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12

最新評論

东方市| 滦平县| 宁乡县| 柳河县| 志丹县| 铅山县| 开原市| 玉屏| 大余县| 陇西县| 大安市| 依兰县| 鄄城县| 威信县| 山东省| 平武县| 定兴县| 宁夏| 皋兰县| 湟中县| 醴陵市| 迁西县| 耒阳市| 鄯善县| 苍溪县| 化隆| 綦江县| 百色市| 广水市| 栾川县| 休宁县| 阜新| 桐乡市| 右玉县| 交口县| 揭阳市| 赤水市| 陈巴尔虎旗| 庐江县| 股票| 泰州市|