【问题标题】:Node.js - getting current filenameNode.js - 获取当前文件名
【发布时间】:2012-12-21 12:12:10
【问题描述】:

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

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

【问题讨论】:

标签: node.js


【解决方案1】:

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

【讨论】:

  • 很酷。使用“npm install --save console-plus”安装,或者如果您使用的是 yarn:“yarn add console-plus”
【解决方案2】:

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

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);
  • 只想复制粘贴这个超级好用的单行字的朋友,别忘了提前var path = require('path');或者改成module.filename.slice(__filename.lastIndexOf(require('path').sep)+1, module.filename.length -3);
  • -3 假定扩展的长度,这样的东西可能会更好path.basename(module.filename, path.extname(module.filename))
【解决方案3】:

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 模块中定义。
  • @Cullub,从 nodejs 中提取 documentation:这些 CommonJS 变量在 ES 模块中不可用。 __filename__dirname 的等价物可以通过 import.meta.url 在每个文件中创建。
【解决方案4】:

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

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

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

【讨论】:

  • 这就是我来这里的目的。谢谢!
  • 这应该是公认的答案。在严格模式下工作。非常简单。谢谢!
  • 除非您的扩展名不是 2 个字符长,这是完全可能的,因为您可以将脚本解释绑定到您想要的任何文件扩展名......所以这可能不是一个好的全方位解决方案。
【解决方案5】:
'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

【讨论】:

  • 请补充说明
  • @DanielCheung 你来了!但实际上所有这些都可以在 Internet 上搜索到,只需 google javascript split 即可。
  • 我在帮你... -_- 你的答案被投票删除。没有充分解释或仅包含代码的答案被删除。
【解决方案6】:

嗯,我想用文件名作为记录器的标签,所以最直接的,我想要的是这样的:

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

【讨论】:

    【解决方案7】:

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

    【讨论】:

    • 在 macOS 上 __filename.split('/').pop()
    • 在任何系统上require('path').basename(__filename)
    【解决方案8】:

    你可以使用这个函数来获取文件名:

    /**
     * @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

    【讨论】:

      【解决方案9】:

      只是因为我没有在此处看到它,另一种选择是从 __filename 中删除 __dirname

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

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

      【讨论】:

        猜你喜欢
        • 2013-10-31
        • 2011-05-12
        • 2011-08-18
        • 2010-10-26
        • 2014-03-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多