所以我有国际化需要的节点模块。
我正在尝试获取在结节模块中运行节点模块的文件的当前路径。
用例#1:
内部~/yourProject/node_modules/i18n.js
var current_path_to_locales_dir = path.join(__dirname, "locale");
服务器的路径是:
~/YourUserName/yourProject/app.js
执行var i18n = require("i18n");
试图获得它将返回的路径
/User/YourUserName/yourProject/node_modules/locale
哪个是正确的,但我希望它能找到
/User/YourUserName/yourProject/locale
用例#2:
内部~/i18nProject/i18n.js
var current_path_to_locales_dir = path.join(__dirname, "locale");
如果我在~/i18nProject/sample
中有一个示例应用并执行var i18n = require("../i18n");
此次locale
目录将是
/User/YourUserName/i18nProject/locale
上述情况再次正确,但我希望它是
/User/i18nProject/sample/locale/
现在我想知道是否有办法可以获得当前正在运行的脚本的路径?
答案 0 :(得分:14)
使用变量__filename,__ dirname将返回名为modules / scripts的名称和路径,请参阅此处http://nodejs.org/docs/latest/api/globals.html#globals_filename
在你的情况下,你需要得到模块/脚本的调用者:
Node.js不会为您执行此操作,因此从技术上讲,您可能需要为模块添加额外的包装器和参数,并将其转换为接受此信息的函数。
但是,通过使用Error.prepareStackTrace可以实现getCaller 这个主题已经有了你的解决方案:
How can one get the file path of the caller function in node.js?
答案 1 :(得分:2)
如果您想在使用npm包的用户的项目中使用默认的locals
目录,请更改以下行:
var current_path_to_locales_dir = path.join(__dirname, "locale");
为:
var current_path_to_locales_dir = path.join(__dirname, "..", "locale");
// The ".." moves back one directory out of node_modules.
请确保运行上述代码的文件位于npm包的根目录中。更改为path.resolve
可能更好,但我会让您探讨差异,因为这超出了您的问题的范围。
如果要使用require("../i18n");
访问npm包中的示例目录,请更改以下行:
var current_path_to_locales_dir = path.join(__dirname, "locale");
为:
var current_path_to_locales_dir = path.join(__dirname, "sample", "locale");
与案例1相同,请确保在代码上方运行的文件位于npm包的根目录
中