NodeJS中模块的应用程序基本路径

Posted

技术标签:

【中文标题】NodeJS中模块的应用程序基本路径【英文标题】:App base path from a module in NodeJS 【发布时间】:2014-03-05 10:00:13 【问题描述】:

我正在使用 NodeJS 构建一个 Web 应用程序,并且我正在单独的模块中实现我的 API 路由。在我的一条路线中,我正在进行一些文件操作,我需要知道基本应用程序路径。如果我使用__dirname,它当然会给我包含我的模块的目录。

我目前正在使用它来获取基本应用程序路径(假设我知道从基本路径到模块的相对路径):

path.join(__dirname, "../../", myfilename)

有没有比使用../../ 更好的方法?我在 Windows 下运行 Node,所以没有 process.env.PWD 并且我不想成为特定于平台的。

【问题讨论】:

在多个模块中多次/多次使用上面的行是重复且不一致的。在这种情况下,在 static 类(例如 Paths.getBasePath();)中创建 static 函数可能很有用。当您的项目结构发生变化时,您只需要更新上述函数中的相对路径。通过这样的方法,您可以在任何地方使用require('./Paths').getBasePath();,而无需再次使用../../ 【参考方案1】:

您可以在 app.js 中定义一个全局变量:

global.__basedir = __dirname;

然后你可以在任何地方使用这个全局变量。像这样:

var base_path = __basedir

【讨论】:

我不喜欢这个的是我失去了自动补全功能:( 我看到人们一般不建议使用全局变量。【参考方案2】:

您可以使用不带参数的path.resolve() 来获取通常是基本应用程序路径的工作目录。如果参数是相对路径,则假定它是相对于当前工作目录的,因此您可以编写

require(path.resolve(myfilename));

在应用根目录中要求您的模块。

【讨论】:

【参考方案3】:

使用__dirname 的方法是最可靠的方法。它总是会给你正确的目录。您不必担心 Windows 环境中的 ../../,因为 path.join() 会解决这个问题。

虽然有一个替代解决方案。您可以使用process.cwd() 返回进程的当前工作目录。如果您从基本应用程序目录执行节点应用程序,该命令可以正常工作。但是,如果你从不同的目录执行你的节点应用程序,比如说它的父目录(例如node yourapp\index.js),那么__dirname 机制会更好地工作。

我希望这会有所帮助。

【讨论】:

process.cwd() 非常适合在应用程序基路径上运行的应用程序。谢谢! ../../ 有效,但感觉更像是被破解了。

以上是关于NodeJS中模块的应用程序基本路径的主要内容,如果未能解决你的问题,请参考以下文章

介绍nodejs中的path模块的几个方法

NodeJS代码组织与部署

nodejs的require模块及路径

用于复杂应用程序结构的 NodeJS 本地模块

NodeJS模块系统

Part5-1-2 Nodejs 核心模块