Tengo una pregunta sobre el manejo de rutas de Nodejs. Sé que tienen una página sobre eso en los documentos, pero no contenía lo que necesitaba.
Básicamente, tengo un archivo que incluye una ruta relativa que hace referencia a un archivo (png en este caso).
Ahora, según desde dónde llamo el archivo, la imagen se encuentra o no se encuentra (como el punto en el sistema de archivos desde donde se llama cambia).
Estoy usando el marco 'sharp', 'sharp('./picture.png')' es similar a require.
Example: File 'render.js' : const pic = sharp('./picture.png') Calling: cmd\examplePath> node render.js //picture is found cmd> node ./examplePath/render.js //picture is not found The location of the picture relative to the file stays the same at all times!Mi pregunta ahora es si lo que he descrito es de esperar de Nodejs o si hay algo mal. ¿Qué tendría que hacer para poder llamar al archivo desde cualquier lugar y que siga funcionando?
Cualquier consejo es apreciado. Gracias :)
Normalmente, el manejo de archivos en nodejs como fs.open() solo resuelve una ruta relativa frente al directorio de trabajo actual en nodejs. El directorio de trabajo actual será cualquiera que sea el directorio de trabajo del sistema operativo cuando inició su aplicación nodejs.
El directorio de trabajo actual no es necesariamente el mismo que el directorio donde se encuentra su secuencia de comandos porque el directorio de trabajo actual puede ser diferente de donde se encuentra su secuencia de comandos cuando se inició su programa nodejs.
Entonces, en sus dos ejemplos de línea de comando, cada uno comienza con un directorio de trabajo actual diferente, por lo tanto, uno funciona y el otro no.
En general, en nodejs, no es recomendable confiar en cuál es el directorio de trabajo actual porque esto reduce la capacidad de reutilizar su código en otros proyectos donde podría cargarse desde un directorio diferente. Por lo tanto, si el archivo al que intenta hacer referencia se encuentra en una ubicación conocida en relación con la ubicación del sistema de archivos de su secuencia de comandos, normalmente crearía una ruta completa, utilizando __dirname (en los módulos CommonJS) o import.meta.url o import.meta.resolve() (en módulos ESM).
Por ejemplo, si la imagen está en el mismo directorio que su secuencia de comandos, podría hacerlo en un módulo CommonJS:
const path = require('path'); const fullPath = path.join(__dirname, "picture.png"); const pic = sharp(fullPath);En un módulo ESM, podría hacer:
import path from 'path'; const __dirname = new URL('.', import.meta.url).pathname; const fullPath = path.join(__dirname, "picture.png"); const pic = sharp(fullPath);Mi pregunta ahora es si lo que he descrito es de esperar de Nodejs o si hay algo mal.
Sí, eso es de esperar. Está iniciando su programa con diferentes directorios de trabajo actuales y tiene un código que depende de que el directorio de trabajo actual tenga un cierto valor (debido a su uso de una ruta relativa).
¿Qué tendría que hacer para poder llamar al archivo desde cualquier lugar y que siga funcionando?
Cree una ruta absoluta utilizando el directorio de su secuencia de comandos como ubicación de anclaje, como se muestra arriba.
Tenga en cuenta que require() o import usan una lógica de búsqueda de archivos completamente diferente y tienen un comportamiento incorporado que es relativo a la ubicación del módulo que los está ejecutando. Pero, son la excepción, no la regla. Las operaciones en el módulo fs (u otros módulos que usan el módulo fs ) usan el directorio de trabajo actual como la ruta base si proporciona una ruta relativa.