Trabajando con archivos: fs module.
fs
es el módulo nativo de Node.js que permite interactuar con los archivos del sistema.
Es importante que no uses fs
en entornos de persistencia efímera como Heroku, lambdas o cloud functions ya que se perderán los archivos con los que trabajes.
A partir de la version 11 de Node.js la versión con promeses de fs
esta disponible para su uso (sin ser experimental). Previamente solo estaban disponibles métodos con callbacks.
const fsPromise = require('fs').promises;
Variables especiales
__dirname
: Retorna un string con path absoluto del directorio actual.__filename
: Retorna un string con path absoluto del fichero actual, incluyendo su nombre.
Rutas “relativas”
La gran mayoría de métodos de fs
toman como primer argumento la ruta relativa del fichero/directorio con el que quieres interactuar. A bote pronto, lo lógico es que pienses en una ruta relativa al uso desde el fichero actual. Sin embargo, esto puede generar muchos dolores de cabeza porque no es una ruta relativa desde el fichero actual, sino que es desde el custom working directory. Es decir, la raíz del proyecto (si no cambiaste el CWD en algún momento).
Si quieres escribir en el directorio del archivo del script, puedes hacerlo fácilmente utilizando la variable __dirname
. Ej: __dirname + '/out.txt'
Por último, puedes trabajar con otros directorios fácilmente haciendo uso del módulo path.
En resumen:
./
: Current Working Directory.__dirname
: Path absoluto del archivo donde se ejecuta el script.path.join(__dirname, '../../out.txt')
: Ejemplo de subir dos niveles al directorio del script.
sync vs async
Los métodos del módulo fs
se ejecutan por defecto de forma asíncrona (async). Sin embargo, la mayoría de los métodos cuentan con una version síncrona. Ejemplo: readFile()
(async) Vs readFileSync()
(sync).
Es una buena práctica usar los métodos asíncronos para evitar el bloqueo del bucle de eventos y por lo tanto la aplicación. Ya que por lo general las operaciones con fs
son operaciones pesadas.
No obstante, estos métodos existe porque hay ocasiones en los que interesa bloquear el bucle de eventos. Un ejemplo claro es la carga de configuración al iniciar una aplicación.
Métodos habituales de fs
readFile(path, callback)
: Leer un archivo.writeFile(path, data, callback)
: Escribir un archivo y, si existe, sobreescribir.appendFile(path, data, callback)
: Añade información a un archivo existente.watchFile(path, callback)
: Observar cambios en un archivo concreto.
Además de los métodos de archivo, te recomiendo que comprendas bien como funcionan los métodos generales de directorio:
stat(path, callback)
: Estadísticas de un directorio.unlink(path, callback)
: Borrar un archivo.watch(filename, callback)
: Observar cambios en un directorio.readdir(path)
: Listar archivos de un directorio.