在Node.js中引用相对于应用程序根目录的文件的正确方式

vs3odd8k  于 2022-09-21  发布在  Node.js
关注(0)|答案(5)|浏览(123)

我有一个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’,这很有效,但它似乎很脆弱,因为我认为这只是相对于‘向上一个目录’的解析。如果我将模板阅读服务移动到更深层的子目录,该路径将中断。

那么,相对于应用程序根目录引用文件的正确方式是什么呢?

pdkcd3nj

pdkcd3nj1#

尝试

var templateContent = fs.readFileSync(path.join(__dirname, '../templates') + '/my-template.html', 'utf8');
xzabzqsa

xzabzqsa2#

要获取运行节点进程的目录的绝对文件系统路径,可以使用process.cwd()。因此,假设*/server.js作为一个进程运行,该进程将/服务/模板-读取-服务.js作为一个模块来实现,那么您可以从/服务/模板-读取-服务.js**执行以下操作:

var appRoot = process.cwd(),
    templateContent = fs.readFileSync(appRoot + '/templates/my-template.html', 'utf8');

如果这不起作用,那么您可能正在作为一个单独的进程运行**/服务/模板-阅读-服务**,在这种情况下,您将需要让任何启动该进程的进程向它传递您希望将其视为应用程序根目录的路径。例如,如果/server.js将**/服务/模板-读取-服务.js作为单独的进程启动,那么/server.js**应该向它传递自己的cess.cwd()。

e7arh2l6

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的答案受到了应有的抨击。路人们,当心绿色标志。

e3bfsja2

e3bfsja24#

对于ES模块,__dirname不可用,因此请阅读this answer并使用:

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
6fe3ivhb

6fe3ivhb5#

我们可以使用路径模块来访问当前路径

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

相关问题