Pero, ¿cómo podemos responder con un fichero, como un PDF, una imagen o una hoja de cálculo?
La respuesta está en el siguiente código:
const express = require('express');
const path = require('path');
const fs = require('fs');
const app = express();
app.get('/repository/:file', function (req, res) {
const filePath = path.join(__dirname, `docs/${req.params.file}`);
const stat = fs.statSync(filePath);
res.writeHead(200, {
'Content-Type': 'application/pdf',
'Content-Length': stat.size
});
var readStream = fs.createReadStream(filePath);
readStream.pipe(res);
});
app.listen(3000, function () {
console.log('Example app serving files on port 3000!');
});
El servicio atenderá a la siguiente URL:
http://
La segunda línea, define la ruta de acceso al fichero. En este caso, la ruta será, partiendo de la ruta del código, añadirá la carpeta docs, en la cual se alojan los archivos.
La tercera línea obtendrá el número de bytes del fichero a enviar.
A continuación, se prepara la cabecera de la respuesta (mediante res.writeHead), indicando que el archivo a enviar será de tipo PDF (atributo Content-Type), junto con el número de bytes que se envía (atributo Content-Length).
Después, se crea un stream de lectura del fichero (mediante createReadStream), al que se le conecta un pipe a la respuesta. Esta operación lee el fichero y envía los datos a la respuesta. Resumiendo, el flujo de lectura del fichero estará conectado al flujo de escritura en la respuesta del servicio.
Enlaces de interés:
- Tipos mime: https://www.sitepoint.com/mime-types-complete-list/
- Artículo "El manejo de streams en NodeJS" (El abismo de null): https://elabismodenull.wordpress.com/2017/03/28/el-manejo-de-streams-en-nodejs/
- Cabecera de respuesta mediante response.writeHead: https://nodejs.org/api/http.html#http_response_writehead_statuscode_statusmessage_headers
- Flujo de lectura mediante createReadStream: https://nodejs.org/en/knowledge/advanced/streams/how-to-use-fs-create-read-stream/
- Pipes: https://apuntes.de/nodejs/pipes/