在 Node.JS 中引用相对于应用程序根目录的文件的正确方法
- 2024-11-13 08:36:00
- admin 原创
- 23
问题描述:
我在 AWS EC2 上的 Linux 上运行了一个 Node.JS 应用程序,它使用 fs 模块读取 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',并且成功了,但它似乎不太可靠,因为我认为这只是相对于“上一个目录”的解析。如果我将 template-reading-service 移动到更深的子目录,该路径将会中断。
那么,引用相对于应用程序根目录的文件的正确方法是什么?
解决方案 1:
尝试
var templateContent = fs.readFileSync(path.join(__dirname, '../templates') + '/my-template.html', 'utf8');
解决方案 2:
要获取节点进程正在运行的目录的绝对文件系统路径,可以使用process.cwd()
。因此,假设您正在运行/server.js作为将/services/template-reading-service.js实现为模块的进程,那么您可以从/service/template-reading-service.js执行以下操作:
var appRoot = process.cwd(),
templateContent = fs.readFileSync(appRoot + '/templates/my-template.html', 'utf8');
如果这不起作用,那么您可能正在将/service/template-reading-service.js作为单独的进程运行,在这种情况下,您需要让启动该进程的任何程序将您想要视为主应用程序根的路径传递给它。例如,如果 /server.js 将/service/template-reading-service.js作为单独的进程启动,那么/server.js应该将其自己的 process.cwd() 传递给它。
解决方案 3:
接受的答案是错误的。硬编码path.join(__dirname, '../templates')
将执行完全不想要的操作,service-XXX.js
如果文件移动到子位置(如给定的示例services/template
),则会使主应用程序中断。
使用process.cwd()
将返回启动运行进程的文件的根路径(因此,例如 a/Myuser/myproject/server.js
返回/Myuser/myproject/
)。
这是问题“从正在运行的 node.js 应用程序确定项目根目录”的重复。
这个问题的__dirname
答案得到了应有的惩罚。路人,小心绿色标记。
解决方案 4:
对于 ES 模块,__dirname
不可用,因此请阅读此答案并使用:
import { resolve, dirname, join } from 'path'
import { fileURLToPath } from 'url'
import fs from 'fs'
const relativePath = a => join(dirname(fileURLToPath(import.meta.url)), a)
const content1 = fs.readFileSync(relativePath('./file.xyz'), 'utf8') // same dir
const content2 = fs.readFileSync(relativePath('../file.xyz'), 'utf8') // parent dir
解决方案 5:
我们可以使用路径模块来访问当前路径
const dirname = __dirname;
const path = require('path');
path.resolve(dirname, 'file.txt')
在哪里
dirname - is give us present working directory path name
file.txt - file name required to access
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件