如何获取当前文件名、函数名和行号?
我想将其用于日志记录/调试目的,相当于C语言中的
我想将其用于日志记录/调试目的,相当于C语言中的
__FILE__
和 __LINE__
。__FILE__
和 __LINE__
。Node.js提供了一个标准API来实现这一点:Path。
获取当前脚本的名称就很容易:
var path = require('path');
var scriptName = path.basename(__filename);
script.js
的脚本,你会得到 script.js
。如果你只想获取没有扩展名的文件名,因为我们在这里讨论的是一个 js
脚本,你可以使用 var scriptName = path.basename(__filename, '.js');
或 var scriptName = path.basename(__filename, path.extname(__filename))
。 - hervepath.parse(__filename).name
- RH BeckerCommonJS
变量在 ES 模块中不可用。
可以通过 import.meta.url
在每个文件内部创建类似于 __filename
和 __dirname
的变量。 - hervevar scriptName = path.basename(__filename).replace(/\.js$/i, '' );
- fedmich在一个模块中,您可以执行以下任何操作来获取包含文件名的完整路径
this.filename;
module.filename;
__filename;
如果您只想获取文件名(不包括路径和扩展名),可以尝试以下方法。
module.filename.slice(__filename.lastIndexOf(path.sep)+1, module.filename.length -3);
path.sep
以实现跨平台。这是我所做的:__filename.slice(__filename.lastIndexOf(path.sep)+1)
。 - Ryanvar path = require('path');
或将其更改为 module.filename.slice(__filename.lastIndexOf(require('path').sep)+1, module.filename.length -3);
。 - forrestrangerpath.basename(module.filename, path.extname(module.filename))
。 - dre仅获取文件名,无需任何额外模块:
// 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' ]
*
**/
在这里,我们使用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
的回答上面。
你还可以看一下console-plus。它可以在任何日志文本中添加文件名和行号,并且对 .log、.info 和 .error 有不同的颜色。
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
});
__dirname
和__filename
不可用。我知道时间已经很长了,但是我所做的是__filename.split('\\').pop()
。这将获取包含文件名的完整路径,通过\
进行分割,然后获取最后一个索引,即为您的文件名。
__filename.split('/').pop()
。 - Ruben Murrayrequire('path').basename(__filename)
的意思是获取当前文件的文件名(不含路径)。 - Cameron Tacklind/**
* @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(/^.*[\\\/]/, '');
}
在这里没有列出来的另一个选择是,只需从__filename
中删除__dirname
。
__filename.replace(`${__dirname}/`, '')
如果您不想导入 path
模块,那么我认为这很有用。然而,我相信 path.basename(__filename)
是最合适的。
我想将文件名作为日志记录器的标签,最直接和我想要的方法如下:
__filename.substring(__dirname.length + 1, __filename.lastIndexOf("."))