fs y fs/promises
node:fs y node:fs/promises leen, escriben y transmiten archivos en disco: APIs de promesas para trabajo asíncrono, streams para escalabilidad y flags explícitas para lecturas y escrituras sensibles a la seguridad.
Busca en todas las páginas de la documentación
node:fs y node:fs/promises leen, escriben y transmiten archivos en disco: APIs de promesas para trabajo asíncrono, streams para escalabilidad y flags explícitas para lecturas y escrituras sensibles a la seguridad.
import { readFile, writeFile, mkdir } from 'node:fs/promises';
import { createReadStream } from 'node:fs';
await mkdir('data', { recursive: true });
await writeFile('data/out.json', JSON.stringify({ ok: true }));
const text = await readFile('data/out.json', 'utf8');Cuándo usarlo:
import { open, writeFile, rename } from 'node:fs/promises';
import { createReadStream } from 'node:fs';
import { pipeline } from 'node:stream/promises';
import { createGzip } from 'node:zlib';
import { createWriteStream } from 'node:fs';
async function atomicWrite(path: string, data: string): Promise<void> {
const tmp = `${path}.tmp`;
await writeFile(tmp, data, { encoding: 'utf8', mode: 0o600 });
await rename(tmp, path);
}
async function tailBytes(path: string, max: number): Promise<Buffer> {
const handle = await open(path, 'r');
try {
const stat = await handle.stat();
const size = stat.size;
const start = Math.max(0, size - max);
const len = size - start;
const buf = Buffer.alloc(len);
await handle.read(buf, 0, len, start);
return buf;
} finally {
await handle.close();
}
}
await pipeline(createReadStream('large.log'), createGzip(), createWriteStream('large.log.gz'));Lo que esto demuestra:
filehandle.read lee el segmento final sin cargar todo el archivopipeline + createReadStream comprime registros grandes con memoria acotada0o600 para configuración sensible en Unixopen/filehandle para lecturas/escrituras posicionadas.'r', 'w', 'a', 'wx' creación exclusiva - previene sobrescrituras accidentales.fs.watch / fs.promises.watch - elimina el rebote en herramientas de desarrollo; prefiere señales de recarga explícitas en producción.| Escenario | API |
|---|---|
| Configuración pequeña | readFile |
| Descarga grande | createReadStream |
| Configuración atómica | escribir temporal + renombrar |
| Asegurar directorio | mkdir({ recursive: true }) |
import { access, constants } from 'node:fs/promises';
await access('/path/to/file', constants.R_OK);fs/promises o streams.../../etc/passwd. Solución: resolver bajo el directorio base.try/finally con close().| Alternativa | Usar cuándo | No usar cuándo |
|---|---|---|
| S3 SDK | Almacenamiento de objetos duradero | Temporal local está bien |
fs-extra npm | Ayudantes de copia recursiva | mkdir recursivo integrado es suficiente |
| BLOB de base de datos | Artefactos consultables | Activos estáticos grandes |
| memfs (pruebas) | Pruebas unitarias sin disco | Producción |
Usa node:fs/promises - solo promisifica lo heredado en proyectos existentes.
Archivo más grande que el presupuesto de memoria o para enviar a HTTP/gzip - siempre streams para escalar cargas/descargas.
Escritura exclusiva - falla si el archivo existe - útil para archivos de bloqueo.
En el mismo sistema de archivos es atómico en POSIX - úsalo para intercambios de configuración; el renombrado entre dispositivos puede requerir copiar+eliminar.
Condición de carrera entre stat y open - abre con patrones O_NOFOLLOW para código sensible a la seguridad.
Errores de permiso - ejecuta el contenedor como no-root con los montajes de volumen correctos.
import { tmpdir } from 'node:os' - limpia los archivos temporales en el bloque finally.
Node 20+ readdir con recursive: true - ten en cuenta el tamaño del resultado en árboles grandes.
fs.copyFile para copias simples - streams para transformar mientras se copia.
Asegúrate de que UID GID coincida con el usuario node para permisos de escritura.
El módulo path las maneja - evita las barras invertidas codificadas.
Conceptos básicos de Streams para patrones de pipeline.
Versiones de la pila: Esta página fue escrita para Node.js 24.18.0 (LTS activa), npm 10+, TypeScript 5.6+, Express 5, Fastify 5 y NestJS 11.
Revisado por Chris St. John·Última actualización: 16 jul 2026