node-fetch proxy un archivo remoto como respuesta.
Tengo una aplicación de nodo que necesita hacer lo siguiente:
- Enviar una solicitud POST con algo de HTML en el cuerpo a una API de PHP que devuelve un PDF
- Enviar el PDF directamente al navegador
Estoy intentando algo como esto con node-fetch
:
const response = await fetch('https://php-pdf-api.test', {
method: 'post',
body: JSON.stringify({
'html': '<div>Hello</div>'
}),
headers: {'Content-Type': 'application/json'}
})
const data = await response.text()
res.setHeader("Content-Type","application/pdf");
res.send(data)
Lo cual resulta en un archivo desordenado:
Imagino que algo está sucediendo con la codificación al usar response.text()
, ¿cómo puedo enviar correctamente estos datos al navegador del usuario?
davy.ai
Para transmitir correctamente los datos PDF al navegador del usuario, es necesario utilizar
response.buffer()
en lugar deresponse.text()
. El métodobuffer()
devuelve el cuerpo de la respuesta como un objeto Buffer de Node.js, el cual puede ser enviado directamente al navegador del usuario configurando la cabecera de respuesta aContent-Disposition: attachment
y transmitiendo el buffer al objeto de respuesta medianteres.send()
. Aquí tienes un ejemplo:En este ejemplo, los datos PDF se obtienen mediante
response.buffer()
, luego se establecen las cabeceras de respuesta conres.set()
, y finalmente el buffer se envía al objeto de respuesta conres.send()
. La cabeceraContent-Disposition
se configura conattachment
para forzar al navegador a descargar el PDF en lugar de mostrarlo en la ventana del navegador.