Node.js – 获取当前文件名

如何获取当前的文件名,函数名和行号?

我想用它来logging/debugging目的,相当于__FILE____FILE__ __LINE__在c

 console.log(__dirname) console.log(arguments.callee.toString()) 

Node.js提供了一个标准的API来做到这一点: Path 。

获取当前脚本的名称非常简单:

 var path = require('path'); var scriptName = path.basename(__filename); 

在一个模块中,您可以执行以下任何操作来获取具有文件名的完整path

 this.filename; module.filename; __filename; 

如果你只是想要没有path或扩展的实际名称,你可以做这样的事情。

 module.filename.slice(__filename.lastIndexOf(path.sep)+1, module.filename.length -3); 

只获取文件名。 没有额外的模块:

 // abc.js console.log(__filename.slice(__dirname.length + 1)); // abc console.log(__filename.slice(__dirname.length + 1, -3)); 
 'use strict'; const scriptName = __filename.split(/[\\/]/).pop(); 

说明

 console.log(__filename); // 'F:\__Storage__\Workspace\StackOverflow\yourScript.js' const parts = __filename.split(/[\\/]/); console.log(parts); /* * [ 'F:', * '__Storage__', * 'Workspace', * 'StackOverflow', * 'yourScript.js' ] * **/ 

这里我们使用正则expression式的 分割函数作为第一个参数。
我们想要分隔符的正则expression式是[\/] (由/\拆分),但是/符号必须被转义以区别于正则expression式终结符/ ,所以/[\\/]/

 const scriptName = __filename.split(/[\\/]/).pop(); // Remove the last array element console.log(scriptName); // 'yourScript.js' 

不要使用这个

你真的应该使用path.basename来代替(首先在Node.js v0.1.25中logging ),因为它处理所有你不想知道的angular落情况像内部的斜线文件名(例如文件名为“foo \ bar”上UNIX)。 参见上面的 path答案。

你也可以看看主机加 。 这增加了文件名和linenumber到任何日志文本,并且对.log,.info和.error具有不同的颜色。

那么,我想使用文件名作为logging器的标签,所以最直接的,我想要的是这样的:

 __filename.substring(__dirname.length + 1, __filename.lastIndexOf(".")) 

我正在使用以下正则expression式:

 ([^\\/]+?)(?:\.[^\.\\/]*)?$ 

在string$的末尾工作,有一个可选的非捕获组,用于可能的扩展名(?:\.[^\.\\/]*)?目录分隔符之外的非贪婪捕获组之前是\/ 。 文件名组是非贪婪的,允许下面的非捕获组放弃可能的扩展名。

一个实现将引用第一个也是唯一的捕获组[1]

 var name = __filename.match(/([^\\/]+?)(?:\.[^\.\\/]*)?$/)[1]; 

带有非贪婪/懒惰说明符的文件名捕获组

 ([^\\/]+?) ^ lazy 

要抛弃的可选扩展组锚定$到string的末尾

  (?:\.[^\.\\/]*)?$ ^^ ^ non-capture optional 
 var regex = /([^\\/]+?)(?:\.[^\.\\/]*)?$/; [ ["abc.js", "abc"], ["/tmp/test/../lib/stuff.js", "stuff"], ["c:\\temp\\test\\..\\lib\\stuff.js", "stuff"], ["./abc/def.js", "def"], [".\\abc\\win.js", "win"], ["./lib/my-module.js", "my-module"], [".\\lib/my-dotless", "my-dotless"], ["..///lib/..\\\\.//..dots&seps..", "..dots&seps."], ["trailing-dots...js", "trailing-dots.."] ].forEach( test => { var name = test[0].match(regex)[1]; var result = test[0] + " => " + test[1] + " # " + (name === test[1] ? "Passed" : "Failed"); console.log(result); });