如何在Node.js中从模块获取应用程序基础路径?

44

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

我目前正在使用以下方法获取基础应用程序路径(假设我知道相对于基础路径的模块的路径):

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

有没有比使用 ../../ 更好的方法?我在 Windows 下运行 Node.js,所以没有 process.env.PWD,而且我也不想只适用于某个平台。


在多个模块或多次使用相同的行是重复且不一致的。在这种情况下创建一个_static_类中的_static_函数可能很有用(例如 Paths.getBasePath();)。当项目结构更改时,您只需要在上述函数中更新相对路径。使用这样的方法,您可以在任何地方使用require('./Paths').getBasePath();,而无需再次使用../../ - Tim Visée
3个回答

45
使用__dirname的方法是最可靠的。它总是会给你正确的目录,你不必担心在Windows环境下的../../,因为path.join()会处理这个问题。
然而,还有一种替代方案。你可以使用process.cwd()命令来返回进程的当前工作目录。如果你从基本应用程序目录执行Node.js应用程序,则该命令可以正常工作。但是,如果你从不同的目录执行Node.js应用程序,例如其父目录(例如,node yourapp\index.js)),那么__dirname机制将更好地工作。

1
process.cwd() 在应用程序基本路径下运行时非常好用。谢谢! ../../ 虽然可行,但感觉更像是一种临时的解决方案。 - Clint Powell

10
你可以在你的app.js文件中定义一个全局变量。
global.__basedir = __dirname;

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

var base_path = __basedir

1
我不喜欢这个的原因是我失去了自动完成功能 :( - Neithan Max
我看到大多数人普遍不推荐使用全局变量。 - teoring
在这种情况下,在您的项目根目录下创建一个名为"basePath.ts"的新文件,然后从中导出export const basePath = __dirname;。然后,您可以在需要的地方导入{basePath}并使用它。这样,您就可以获得自动补全功能。 - undefined

10

您可以使用 path.resolve() 函数且不带参数来获取工作目录,通常是应用程序的根路径。如果参数是相对路径,则默认相对于当前工作目录,因此您可以这样写:

require(path.resolve(myfilename));

要求您的模块位于应用程序根目录。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接