簡體   English   中英

在Koa中如何發送生成的文件

[英]How in Koa send generated file

我需要制作一個包含用戶內容的pdf文件,然后將其發送回去。 我選擇了pdfmake ,因為這樣可以制作表格。 我使用Koa .js;

router.post('/pdf', koaBody(), async ctx => {
      const doc = printer.createPdfKitDocument(myFunctionGeneratePDFBody(ctx.request.body));
      doc.pipe(ctx.res, { end: false });
      doc.end();
      ctx.res.writeHead(200, {
        'Content-Type': 'application/pdf',
        "Content-Disposition": "attachment; filename=document.pdf",
      });
      ctx.res.end();
    });

並得到一個錯誤

Error [ERR_STREAM_WRITE_AFTER_END]: write after end
        at write_ (_http_outgoing.js:572:17)
        at ServerResponse.write (_http_outgoing.js:567:10)
        at PDFDocument.ondata (_stream_readable.js:666:20)
        at PDFDocument.emit (events.js:182:13)
        at PDFDocument.EventEmitter.emit (domain.js:442:20)
        at PDFDocument.Readable.read (_stream_readable.js:486:10)
        at flow (_stream_readable.js:922:34)
        at resume_ (_stream_readable.js:904:3)
        at process._tickCallback (internal/process/next_tick.js:63:19)

但是保存在中間文件中並發送其工作...

router.post('/pdf', koaBody(), async ctx => {
  await new Promise((resolve, reject) => {
    const doc = printer.createPdfKitDocument(generatePDF(ctx.request.body));
    doc.pipe(fs.createWriteStream(__dirname + '/document.pdf'));
    doc.end();
    doc.on('error', reject);
    doc.on('end', resolve);
  })
    .then(async () => {
      ctx.res.writeHead(200, {
        'Content-Type': 'application/pdf',
        'Content-Disposition': 'attachment; filename=document.pdf',
      });
      const stream = fs.createReadStream(__dirname + '/document.pdf');
      return new Promise((resolve, reject) => {
        stream.pipe(ctx.res, { end: false });
        stream.on('error', reject);
        stream.on('end', resolve);
      });
    });
  ctx.res.end();
});

避免使用writeHead ,請參閱https://koajs.com/#response

這樣做:

ctx.attachment('file.pdf');
ctx.type =
  'application/pdf';
const stream = fs.createReadStream(`${process.cwd()}/uploads/file.pdf`);
ctx.ok(stream); // from https://github.com/jeffijoe/koa-respond

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM