【发布时间】:2012-12-21 12:12:10
【问题描述】:
如何获取当前文件名、函数名和行号?
我想用它来记录/调试,相当于c中的__FILE__,__LINE__
【问题讨论】:
-
我看到没有人为函数名或行号想出一个好的答案。
标签: node.js
如何获取当前文件名、函数名和行号?
我想用它来记录/调试,相当于c中的__FILE__,__LINE__
【问题讨论】:
标签: node.js
您还可以查看console-plus。这会将文件名和行号添加到任何日志记录文本中,并且 .log、.info 和 .error 具有不同的颜色。
【讨论】:
在模块中,您可以执行以下任何操作来获取带有文件名的完整路径
this.filename;
module.filename;
__filename;
如果您只想要没有路径或扩展名的实际名称,您可以这样做。
module.filename.slice(__filename.lastIndexOf(path.sep)+1, module.filename.length -3);
【讨论】:
var path = require('path');或者改成module.filename.slice(__filename.lastIndexOf(require('path').sep)+1, module.filename.length -3);
path.basename(module.filename, path.extname(module.filename))
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))
path.parse(__filename).name
__filename 未在 ES6 模块中定义。
CommonJS 变量在 ES 模块中不可用。 __filename 和 __dirname 的等价物可以通过 import.meta.url 在每个文件中创建。
仅获取文件名。 没有额外的模块:
// 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函数,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),因为它可以处理所有你不想知道的极端情况,比如内部带有斜杠的文件名(例如,在unix上名为“foo\bar”的文件) .见path 回复above。
【讨论】:
javascript split 即可。
嗯,我想用文件名作为记录器的标签,所以最直接的,我想要的是这样的:
__filename.substring(__dirname.length + 1, __filename.lastIndexOf("."))
【讨论】:
我知道已经很久了,但我所做的是__filename.split('\\').pop()。这将获得带有文件名的完整路径,将其拆分为\,然后获得最后一个索引,这将是您的文件名。
【讨论】:
__filename.split('/').pop()
require('path').basename(__filename)
你可以使用这个函数来获取文件名:
/**
* @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
【讨论】:
只是因为我没有在此处看到它,另一种选择是从 __filename 中删除 __dirname。
__filename.replace(`${__dirname}/`, '')
如果您不想导入 path 模块,我认为这很有用。不过,我确实认为path.basename(__filename) 是最合适的。
【讨论】: