linux node.js

linux - Forma correcta de hacer referencia a los archivos en relación con la raíz de la aplicación en Node.JS



(3)

La respuesta aceptada es incorrecta. Hardcoding path.join(__dirname, ''../templates'') hará exactamente lo que no se desea, haciendo que el archivo service-XXX.js la aplicación principal si se mueve a una ubicación secundaria (como en el ejemplo de services/template ) .

El uso de process.cwd() devolverá la ruta de acceso raíz del archivo que inició el proceso en ejecución (por lo tanto, como ejemplo, /Myuser/myproject/server.js devuelve /Myuser/myproject/ ).

Este es un duplicado de la pregunta. Determine la raíz del proyecto desde una aplicación node.js en ejecución .

En esa pregunta, la respuesta de __dirname obtuvo los azotes adecuados que merece. Cuidado con la marca verde, transeúntes.

Tengo una aplicación Node.JS que se ejecuta en Linux en AWS EC2 que usa el módulo fs para leer en archivos de plantilla HTML. Aquí está la estructura actual de la aplicación:

/server.js /templates/my-template.html /services/template-reading-service.js

Las plantillas HTML siempre estarán en esa ubicación, sin embargo, el servicio de lectura de plantillas puede moverse a diferentes ubicaciones (subdirectorios más profundos, etc.) Desde el servicio de lectura de plantillas, uso fs.readFileSync () para cargar el archivo. , al igual que:

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

Esto arroja el siguiente error:

Error: ENOENT, no such file or directory ''./templates/my-template.html''

Supongo que esto se debe a que la ruta ''./'' se está resolviendo en el directorio ''/ services /'' y no en la raíz de la aplicación. También he intentado cambiar la ruta a ''../templates/my-template.html'' y funcionó, pero parece frágil porque imagino que solo se está resolviendo en relación con ''subir un directorio''. Si muevo el servicio de lectura de plantillas a un subdirectorio más profundo, esa ruta se interrumpirá.

Entonces, ¿cuál es la forma correcta de hacer referencia a los archivos en relación con la raíz de la aplicación?


Para obtener una ruta de acceso absoluta del sistema de archivos al directorio donde se ejecuta el proceso del nodo, puede usar process.cwd() . Entonces, asumiendo que está ejecutando /server.js como un proceso que implementa /services/template-reading-service.js como un módulo, entonces puede hacer lo siguiente desde /service/template-reading-service.js :

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

Si eso no funciona, es posible que esté ejecutando /service/template-reading-service.js como un proceso separado, en cuyo caso deberá hacer que los lanzamientos que pasan por ese proceso pasen la ruta que desea tratar como la aplicación principal . raíz. Por ejemplo, si /server.js lanza /service/template-reading-service.js como un proceso separado, entonces /server.js debería pasarle su propio proceso.cwd ().


Tratar

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