【问题标题】:How do I get the parent file name from a child file name?如何从子文件名中获取父文件名?
【发布时间】:2018-05-11 19:30:01
【问题描述】:

我正在使用以下内容从parent.js 文件中打印文件名:

let path = require('path');
let fileName = path.basename(__filename);
console.log(fileName);

但是,我从parent.js 文件中调用child.js 文件,我实际上想从child.js 文件中打印parent.js 的文件名,例如

console.log(childFileName + " is being called by " + parentFileName);
childFileName is being called by parentFileName

【问题讨论】:

  • 你正在做类似的事情:const child = require(childFileName)?

标签: node.js path


【解决方案1】:

您可以执行以下操作:

parent.js

const path = require('path');
const fileName = path.basename(__filename);
const child = require('child.js')(fileName)

child.js

const path = require('path');
const fileName = path.basename(__filename);

module.exports = (requiredFrom = 'Somewhere') => {
    console.log(`${fileName} is being called from ${requiredFrom}`);
}

此方法需要将调用者的名称作为参数的子文件,这将使其在所需文件中作为参数可用,如果module.exports返回函数,您可以使用该参数


编辑 1

我希望只需要子文件中的路径并从那里打印或使用其他工具

关键部分是将必要的信息从父母传递给孩子,这发生在这里:

const child = require('child.js')(fileName)

因此,要在 parent.js 文件上不需要 path 来做同样的事情,您可以执行以下操作:

parent.js

const child = require('child.js')(__filename);

child.js

const path = require('path');
const fileName = path.basename(__filename);

module.exports = (fileFrom = '') => {
    const requiredFrom = path.basename(fileFrom) || 'Somewhere';
    console.log(`${fileName} is being called from ${requiredFrom}`);
}

无论如何,一旦您在应用中的任何位置需要 path 模块,它将被缓存,因此这不会提高应用的性能。


另外

您也可以以 badhackish 的方式执行此操作,它可能适合您的需求:

parent.js

const child = require('child.js');

child.js

const path = require('path')
const fileName = path.basename(__filename);
const requiredFrom = module.parent.filename;

console.log(`${fileName} is being called from ${requiredFrom}`);

delete require.cache[__filename]

这种方法的缺点是您将失去在 child.js 文件的不同要求中保留值的能力(这会在每次需要时从 require.cache 中删除文件)

【讨论】:

  • 你认为这是唯一的方法吗?如果path 不是最佳选择,我宁愿只在子文件中要求path 并从那里打印或使用其他工具。
  • 如果您愿意,您可以只传递 __filename 变量(无需从 parent.js 文件中执行 path.basename(__filename)),唯一重要的步骤是将该信息传递给所需的文件。跨度>
  • 谢谢,我喜欢使用module.parent.filename。我还使用path.parse(fullPath).base; 仅获取父文件名。
猜你喜欢
  • 2016-12-29
  • 1970-01-01
  • 2019-03-24
  • 1970-01-01
  • 2017-09-09
  • 1970-01-01
  • 1970-01-01
  • 2011-05-14
  • 2011-03-07
相关资源
最近更新 更多