Node.js - 获取当前文件名

Rax*_*eth 105 node.js

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

我想用它来记录/调试的目的,相当于__FILE__,__LINE__ 在C

her*_*rve 211

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

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

var path = require('path');
var scriptName = path.basename(__filename);
Run Code Online (Sandbox Code Playgroud)

  • ES6 模块中未定义 `__filename`。 (12认同)
  • 对于一个名为`script.js`的脚本,你会得到`script.js`.如果你想只有没有扩展名的名字,正如我们在这里所说的`js`脚本你可以使用`var scriptName = path.basename(__ filename,'.js');`或`var scriptName = path.basename (__ filename,path.extname(__ filename))` (7认同)
  • 删除扩展名的另一种方法:`path.parse(__ filename).name` (4认同)
  • @Cullub,摘自nodejs [文档](https://nodejs.org/api/esm.html#esm_no_require_exports_module_exports_filename_dirname):这些`CommonJS`变量在ES模块中不可用。可以通过“import.meta.url”在每个文件内创建“__filename”和“__dirname”的等效项。 (2认同)

Ant*_*ick 46

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

this.filename;
module.filename;
__filename;
Run Code Online (Sandbox Code Playgroud)

如果你只想要没有路径或扩展名的实际名称,你可以做这样的事情.

module.filename.slice(__filename.lastIndexOf(path.sep)+1, module.filename.length -3);
Run Code Online (Sandbox Code Playgroud)

  • -3假设一个扩展的长度,这样的东西可能会更好``path.basename(module.filename,path.extname(module.filename))` (13认同)
  • 您可能希望使用path.sep使其跨平台.这是我做的__filename.slice(__ filename.lastIndexOf(path.sep)+1); (4认同)
  • 对于那些只想复制并粘贴这个超级方便的单行程序的人,不要忘记使用`var path = require('path');`或将其更改为`module.filename.slice(__ filename.lastIndexOf( require('path').sep)+ 1,module.filename.length -3);` (2认同)

Red*_*rus 30

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

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

 // abc
console.log(__filename.slice(__dirname.length + 1, -3));
Run Code Online (Sandbox Code Playgroud)

  • 除非您的扩展名不是 2 个字符长,否则这是完全可能的,因为您可以将脚本解释绑定到您想要的任何文件扩展名……所以这可能不是一个好的全面解决方案。 (5认同)

ily*_*rov 22

'use strict';

const scriptName = __filename.split(/[\\/]/).pop();
Run Code Online (Sandbox Code Playgroud)

说明

console.log(__filename);
// 'F:\__Storage__\Workspace\StackOverflow\yourScript.js'
const parts = __filename.split(/[\\/]/);
console.log(parts);
/*
 * [ 'F:',
 *   '__Storage__',
 *   'Workspace',
 *   'StackOverflow',
 *   'yourScript.js' ]
 *
**/
Run Code Online (Sandbox Code Playgroud)

这里我们使用带有正则表达式的split函数作为第一个参数. 我们要为分隔符的正则表达式(通过拆分或),但符号必须逃脱从正则表达式终止区分开来,所以.
[\/]/\///[\\/]/

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

不要使用它

你真的应该使用path.basename(首先在Node.js v0.1.25中记录),因为它处理你不想知道的所有角落情况,例如带有斜杠的文件名(例如unix上名为"foo\bar"的文件).见上面的path答案.

  • 我正在帮你... -_-你的答案正在被删除.答案没有解释得足够或只是包含代码**将被删除. (3认同)

hei*_*nob 3

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