Node.js - 获取当前文件名

时间:2013-01-07 18:03:33

标签: node.js

如何获取当前文件名,功能名称和行​​号?

我想将它用于记录/调试目的,相当于c中的__FILE____LINE__

10 个答案:

答案 0 :(得分:190)

Node.js提供了一个标准API:Path

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

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

答案 1 :(得分:41)

在模块中,您可以执行以下任一操作以获取文件名

的完整路径
this.filename;
module.filename;
__filename;

如果您只想要没有路径或扩展名的实际名称,可以执行以下操作。

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

答案 2 :(得分:24)

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

// abc.js
console.log(__filename.slice(__dirname.length + 1));

 // abc
console.log(__filename.slice(__dirname.length + 1, -3));

答案 3 :(得分:19)

'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' ]
 *
**/

我们使用split函数,regular expression作为第一个参数 我们想要用于分隔符的正则表达式是[\/](由/\拆分)但必须转义/符号以将其与正则表达式终止符/区分开,所以/[\\/]/

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

不要使用此

你真的应该使用path.basename代替(documented in Node.js v0.1.25},因为它会处理你不想知道的所有角落情况,例如带有斜杠的文件名(例如文件名为&# 34; foo \ bar"在unix上)。请参阅path answer above

答案 4 :(得分:3)

您也可以查看console-plus。这会将文件名和亚麻布添加到任何日志记录文本中,并为.log,.info和.error提供不同的颜色。

答案 5 :(得分:1)

您可以使用此功能获取文件名:

/**
 * @description 
 * get file name from path
 * @param {string} path path to get file name
 * @returns {string} file name
 * @example 
 * getFileName('getFileName/index.js') // => index.js
 */
export default function getFileName(path) {
    return path.replace(/^.*[\\\/]/, '');
}

如果使用nodejs,则可以安装包含此功能的软件包 https://www.npmjs.com/package/jotils

答案 6 :(得分:0)

好吧,我想使用文件名作为记录器的标签,所以最直接的和我想要的是:

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

答案 7 :(得分:0)

我正在使用以下正则表达式:

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

从字符串$的末尾开始,有一个可选的非捕获组,用于可能的扩展名(?:\.[^\.\\/]*)?,前面是非贪婪捕获除目录分隔符\/以外的任何内容的组。文件名组非贪婪允许以下非捕获组丢弃可能的扩展名。

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

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

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

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

要丢弃的可选扩展组将$锚定到字符串的末尾

  (?:\.[^\.\\/]*)?$
   ^^            ^   
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);
});

评价由https://regex101.com

提供

答案 8 :(得分:0)

我知道已经很长时间了,但是我所做的是__filename.split('\\').pop()。这将获得带有文件名的完整路径,将其除以\,然后获得最后一个索引,即您的文件名。

答案 9 :(得分:-4)

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