146

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

我想用它来记录/调试,相当于__FILE____LINE__ 在c

4

9 回答 9

279

Node.js 提供了一个标准 API 来执行此操作:Path

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

var path = require('path');
var scriptName = path.basename(__filename);
于 2015-02-04T10:31:22.753 回答
54

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

this.filename;
module.filename;
__filename;

如果您只想要没有路径或扩展名的实际名称,您可以这样做。

module.filename.slice(__filename.lastIndexOf(path.sep)+1, module.filename.length -3);
于 2013-09-22T10:02:08.303 回答
43

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

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

 // abc
console.log(__filename.slice(__dirname.length + 1, -3));
于 2015-08-06T12:45:54.203 回答
25
'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函数作为第一个参数。 我们想要用于分隔符的正则表达式是(split by or ) 但必须对符号进行转义以将其与正则表达式终止符区分开来,所以.
[\/]/\///[\\/]/

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的答案。

于 2015-08-31T11:41:45.453 回答
3

您还可以查看console-plus。这会将文件名和行号添加到任何日志记录文本中,并且 .log、.info 和 .error 具有不同的颜色。

于 2013-01-08T07:26:34.873 回答
1

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

__filename.substring(__dirname.length + 1, __filename.lastIndexOf("."))
于 2017-04-03T18:58:59.907 回答
1

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

于 2018-07-10T10:20:39.497 回答
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

于 2019-01-27T15:32:09.080 回答
0

只是因为我没有看到它在这里列出,另一种选择是__dirname__filename.

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

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

于 2022-01-09T19:06:49.430 回答