我有一个Node.js应用程序在AWS EC2的Linux上运行,它使用文件系统模块来读入HTML模板文件。以下是该应用程序的当前结构:
/server.js
/templates/my-template.html
/services/template-reading-service.js
HTML模板将始终位于该位置,但是,模板阅读服务可能会移动到不同的位置(更深层的子目录等)在模板读取服务中,我使用fs.readFileSync()加载文件,如下所示:
var templateContent = fs.readFileSync('./templates/my-template.html', 'utf8');
这将引发以下错误:
Error: ENOENT, no such file or directory './templates/my-template.html'
我假设这是因为路径‘./’解析到‘/services/’目录,而不是应用程序根目录。我还尝试将路径更改为‘../Templates/my-template.html’,这很有效,但它似乎很脆弱,因为我认为这只是相对于‘向上一个目录’的解析。如果我将模板阅读服务移动到更深层的子目录,该路径将中断。
那么,相对于应用程序根目录引用文件的正确方式是什么呢?
5条答案
按热度按时间pdkcd3nj1#
尝试
xzabzqsa2#
要获取运行节点进程的目录的绝对文件系统路径,可以使用
process.cwd()
。因此,假设*/server.js作为一个进程运行,该进程将/服务/模板-读取-服务.js作为一个模块来实现,那么您可以从/服务/模板-读取-服务.js**执行以下操作:如果这不起作用,那么您可能正在作为一个单独的进程运行**/服务/模板-阅读-服务**,在这种情况下,您将需要让任何启动该进程的进程向它传递您希望将其视为主应用程序根目录的路径。例如,如果/server.js将**/服务/模板-读取-服务.js作为单独的进程启动,那么/server.js**应该向它传递自己的cess.cwd()。
e7arh2l63#
公认的答案是错误的。硬编码
path.join(__dirname, '../templates')
将执行不需要的操作,使service-XXX.js
文件在移动到子位置(如给定的示例services/template
)时中断主应用程序。使用
process.cwd()
将返回启动运行进程的文件的根路径(例如,/Myuser/myproject/server.js
返回/Myuser/myproject/
)。这是问题Determine project root from a running node.js application的副本。
在这个问题上,
__dirname
的答案受到了应有的抨击。路人们,当心绿色标志。e3bfsja24#
对于ES模块,
__dirname
不可用,因此请阅读this answer并使用:6fe3ivhb5#
我们可以使用路径模块来访问当前路径
哪里