es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

node-fetch proxy un archivo remoto como respuesta.

Tengo una aplicación de nodo que necesita hacer lo siguiente:

  1. Enviar una solicitud POST con algo de HTML en el cuerpo a una API de PHP que devuelve un PDF
  2. 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:

Imagen desordenada

Imagino que algo está sucediendo con la codificación al usar response.text(), ¿cómo puedo enviar correctamente estos datos al navegador del usuario?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para transmitir correctamente los datos PDF al navegador del usuario, es necesario utilizar response.buffer() en lugar de response.text(). El método buffer() 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 a Content-Disposition: attachment y transmitiendo el buffer al objeto de respuesta mediante res.send(). Aquí tienes un ejemplo:

    const response = await fetch('https://php-pdf-api.test', {
      method: 'post',
      body: JSON.stringify({
        'html': '<div>Hello</div>'
      }),
      headers: {'Content-Type': 'application/json'}
    });
    
    const buffer = await response.buffer();
    res.set('Content-Type', 'application/pdf');
    res.set('Content-Disposition', 'attachment; filename="file.pdf"');
    res.send(buffer);
    

    En este ejemplo, los datos PDF se obtienen mediante response.buffer(), luego se establecen las cabeceras de respuesta con res.set(), y finalmente el buffer se envía al objeto de respuesta con res.send(). La cabecera Content-Disposition se configura con attachment para forzar al navegador a descargar el PDF en lugar de mostrarlo en la ventana del navegador.

Comments are closed.