Node.js - 获取当前文件名

174
如何获取当前文件名、函数名和行号?
我想将其用于日志记录/调试目的,相当于C语言中的 __FILE____LINE__

3
文件:https://dev59.com/6HA75IYBdhLWcg3wubun?rq=1 行:https://github.com/visionmedia/callsite - Matt Ball
1
我看没有人给出一个好的函数名或行号的答案。 - Mr. Lance E Sloan
10个回答

309

Node.js提供了一个标准API来实现这一点:Path

获取当前脚本的名称就很容易:

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

18
针对名为 script.js 的脚本,你会得到 script.js。如果你只想获取没有扩展名的文件名,因为我们在这里讨论的是一个 js 脚本,你可以使用 var scriptName = path.basename(__filename, '.js');var scriptName = path.basename(__filename, path.extname(__filename)) - herve
11
去除文件扩展名的另一种方法:path.parse(__filename).name - RH Becker
11
在ES6模块中未定义__filename。 - Cullub
6
@Cullub,摘自nodejs文档:这些 CommonJS 变量在 ES 模块中不可用。 可以通过 import.meta.url 在每个文件内部创建类似于 __filename__dirname 的变量。 - herve
你也可以使用正则表达式字符串替换来删除扩展名。它可以处理文件名中的大写字母。var scriptName = path.basename(__filename).replace(/\.js$/i, '' ); - fedmich
显示剩余2条评论

58

在一个模块中,您可以执行以下任何操作来获取包含文件名的完整路径

this.filename;
module.filename;
__filename;

如果您只想获取文件名(不包括路径和扩展名),可以尝试以下方法。

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

4
您可能希望使用path.sep以实现跨平台。这是我所做的:__filename.slice(__filename.lastIndexOf(path.sep)+1) - Ryan
2
对于那些只想复制粘贴这个超级方便的一行代码的人,请不要忘记在此之前添加 var path = require('path'); 或将其更改为 module.filename.slice(__filename.lastIndexOf(require('path').sep)+1, module.filename.length -3); - forrestranger
24
-3 假定了一个扩展名的长度,使用类似这样的代码可能会更好 path.basename(module.filename, path.extname(module.filename)) - dre

51

仅获取文件名,无需任何额外模块:

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

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

1
这就是我来这里的原因。谢谢! - leviathanbadger
1
这应该是被接受的答案。在严格模式下工作。非常简单明了。谢谢! - Matthew
9
除非你的扩展名不是2个字符长,因为你可以将脚本解释绑定到任何文件扩展名上,所以这可能不是一个很好的全面解决方案。 - ErikE
我只是简单地复制粘贴了这个。谢谢。 - Alex Antoine

27
'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函数,以正则表达式作为第一个参数。
我们想要的分隔符正则表达式是[\/](通过/\进行拆分),但必须对/符号进行转义,以区分它与正则表达式终止符/,因此为/[\\/]/

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

不要使用这个

你真的应该使用path.basename代替(首次在Node.js v0.1.25中文档化),因为它处理了所有你不想知道的边角情况,比如文件名中包含斜杠的情况(例如在Unix上命名为"foo\bar"的文件)。请参见path的回答上面


请添加说明。 - Daniel Cheung
1
@DanielCheung 这是你要的!但实际上,所有这些都可以在互联网上搜索到,只需谷歌“javascript split”并开始。 - ilyaigpetrov
8
我正在帮助你……-_- 你的回答正在被投票删除。如果一个回答没有足够的解释或只包含代码,它将会被删除。 - Daniel Cheung

3

你还可以看一下console-plus。它可以在任何日志文本中添加文件名和行号,并且对 .log、.info 和 .error 有不同的颜色。


1
非常酷。使用“npm install --save console-plus”进行安装,或者如果您使用yarn:“yarn add console-plus”。 - Andrew Faulkner

1
如果您正在使用ES模块,请执行以下操作:
import path from 'node:path';
const FILE_URL = import.meta.url;
const FILE_NAME = path.basename(import.meta.url);
const FILE_NAME_WITHOUT_EXT = path.basename(import.meta.url, path.extname(import.meta.url));

console.log({
  FILE_URL,
  FILE_NAME,
  FILE_NAME_WITHOUT_EXT
});

注意:在Node的ES模块中,__dirname__filename 不可用

1

我知道时间已经很长了,但是我所做的是__filename.split('\\').pop()。这将获取包含文件名的完整路径,通过\进行分割,然后获取最后一个索引,即为您的文件名。


2
在 macOS 上,__filename.split('/').pop() - Ruben Murray
4
在任何系统上,require('path').basename(__filename)的意思是获取当前文件的文件名(不含路径)。 - Cameron Tacklind

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(/^.*[\\\/]/, '');
}

如果您使用Node.js,您可以安装包含此函数的软件包https://www.npmjs.com/package/jotils

1

在这里没有列出来的另一个选择是,只需从__filename中删除__dirname

__filename.replace(`${__dirname}/`, '')

如果您不想导入 path 模块,那么我认为这很有用。然而,我相信 path.basename(__filename) 是最合适的。


1

我想将文件名作为日志记录器的标签,最直接和我想要的方法如下:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接