¿fs.readFileSync no es relativo al archivo? Node.js


104

-Supongamos que tengo un archivo en la raíz de mi proyecto llamado "file.xml"

-Supongamos que tengo un archivo de prueba en tests / llamado "test.js" y tiene

const file = fs.readFileSync("../file.xml");

Si ahora ejecuto node ./tests/test.jsdesde la raíz de mi proyecto, dice ../file.xml no existe. Si ejecuto el mismo comando desde el directorio de pruebas, entonces funciona.

Parece que fs.readFileSync es relativo al directorio desde donde se invoca el script, en lugar de donde se encuentra el script. Si escribiera fs.readFileSync("./file.xml")en test.js, se vería más confuso y no es consistente con las rutas relativas en una declaración require que son relativas al archivo.

¿Por qué es esto?

¿Cómo puedo evitar tener que reescribir las rutas en mi fs.readFileSync?


3
__dirnameno es necesariamente el mismo que el directorio de trabajo actual, pero fs.readFileSync()usa el directorio de trabajo actual. Es probable que el directorio de trabajo actual esté configurado como lo que era cuando lanzó node.
— jfriend00

Respuestas:


181

Puede resolver la ruta relativa a la ubicación del archivo de origen, en lugar del directorio actual, usando path.resolve:

const path = require("path");
const file = fs.readFileSync(path.resolve(__dirname, "../file.xml"));

1
Gracias. Esto funciona y estoy tentado a aceptarlo, pero ¿alguna idea de por qué es necesario? Me gustaría poder explicar a los desarrolladores de mi equipo por qué el paso adicional ya que no es necesario en una declaración de requerimiento. Ejemplo: si tuviera un módulo en el directorio raíz llamado module.js, solo necesitaría require ("../ module.js") en test.js
— Arman

10
Porque las rutas relativas se resuelven utilizando el directorio actual. Y desea resolver usando un directorio diferente. De los documentos : "Se puede usar la ruta relativa a un nombre de archivo. Recuerde, sin embargo, que esta ruta será relativa a process.cwd ()".
— cartant

por alguna razón se me ocurrió que debido a que el archivo local no funcionaba en mi entorno remoto, yo. necesitaría obtener el archivo con una URL completa. Sin embargo, por supuesto que no lo hice y pude usar este método para resolver la ruta absoluta en mi servidor remoto ..
— weaveoftheride
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.