Javascript 如何从外部API向客户端发送文件而不在服务器上保存?

Javascript 如何从外部API向客户端发送文件而不在服务器上保存?,javascript,express,fs,Javascript,Express,Fs,我正在尝试使用外部API生成PDF,然后将该PDF返回到客户端,而不将其保存到服务器。我知道我需要使用fs.createReadStream或管道,但我不知道如何实现它。我在后端使用Express,在前端使用axios,尽管我很乐意使用任何有效的工具。它只需要为Chrome工作,因为这是一个内部工具 PDF返回并使用CURL正确保存,但在我使用JSAPI时,不知何故没有保存服务器端(理想情况下,它不必保存,但只要它到达客户端就无所谓)。我尝试了pipe、readStream和writeStrea

我正在尝试使用外部API生成PDF,然后将该PDF返回到客户端,而不将其保存到服务器。我知道我需要使用fs.createReadStream或管道,但我不知道如何实现它。我在后端使用Express,在前端使用axios,尽管我很乐意使用任何有效的工具。它只需要为Chrome工作,因为这是一个内部工具

PDF返回并使用CURL正确保存,但在我使用JSAPI时,不知何故没有保存服务器端(理想情况下,它不必保存,但只要它到达客户端就无所谓)。我尝试了pipe、readStream和writeStream的一些变体,以及从API调用返回.pipe(res),我可以在客户端下载一个空白PDF,但它从来没有数据

以下是前端的代码:

  .then((response)=>{
    console.log('done', response)
    const url = window.URL.createObjectURL(new Blob([response.data]));
    const link = document.createElement('a');
    link.href = url;
    link.setAttribute('download', 'file.pdf');
    document.body.appendChild(link);
    link.click();
   })
以及后端:

app.post('/pdf', async (req, res) => {
  const data = req.body.data;
  res.writeHead(200, {
    "Content-Type": "application/octet-stream",
    "Content-Disposition": "attachment; filename=result.pdf"
  });

  await request.post('https://www.pdfotter.com/api/v1/pdf_templates/[templateID]/fill')
    .form(data)
    .auth([API KEY], '')
    .pipe(fs.createWriteStream('result.pdf'));

    const filePath =  __dirname + '/result.pdf';

    // Check if file specified by the filePath exists 
    fs.exists(filePath, (exists) => {
      if(exists) {     
        fs.createReadStream(filePath).pipe(res);
      } else {
        res.writeHead(400, {"Content-Type": "text/plain"});
        res.end("ERROR File does not exist");
      }
    });

  }

理想情况下,我希望使用API创建PDF,然后将PDF返回给客户端(或将PDF传递给Google Drive),而不保存到服务器上。

将缓冲区对象直接传递给
write()
res.write(data,“binary”)
,而不是对您的问题的回答,您在此处使用400错误代码似乎是一个错误。400表示“错误请求”。如您自己的代码所示,更合适的代码是404文件未找到。;)@PatrickEvans我不太明白。你是说我应该这样做。pipe(res.write)(那会抛出一个错误)?如果缓冲区对象不在管道中,它在哪里?如果它在管道中,我如何访问它?缓冲区对象是
请求.post()返回的对象。但是如果你只是想用管道()将它发送给客户端,我想它应该是
.pipe(res)
@PatrickEvans.pipe(res)肯定会发送一些数据回来,前端代码会弹出一个PDF下载,但是文件是空的。我已经和CURL/Postman检查了API,它工作正常。它至少应该将模板发回空白,但它不是。直接将缓冲区对象传递给
write()
res.write(data,“binary”)
虽然不是问题的答案,但您在此处使用400错误代码似乎是一个错误。400表示“错误请求”。如您自己的代码所示,更合适的代码是404文件未找到。;)@PatrickEvans我不太明白。你是说我应该这样做。pipe(res.write)(那会抛出一个错误)?如果缓冲区对象不在管道中,它在哪里?如果它在管道中,我如何访问它?缓冲区对象是
请求.post()返回的对象。但是如果你只是想用管道()将它发送给客户端,我想它应该是
.pipe(res)
@PatrickEvans.pipe(res)肯定会发送一些数据回来,前端代码会弹出一个PDF下载,但是文件是空的。我已经和CURL/Postman检查了API,它工作正常。它至少应该将模板发送回空白,但它不是。