Node.js Express:使用pdfkit生成pdf时,所有其他请求都被阻止

Node.js Express:使用pdfkit生成pdf时,所有其他请求都被阻止,node.js,express,node-pdfkit,Node.js,Express,Node Pdfkit,使用以下代码,当请求/pdf时,express将停止服务所有其他页面,直到生成pdf。如何使PDF生成同步?谢谢 app.get('/pdf', function (req, res) { var publication_id = req.query['id'] // e.g. http://localhost:3000/pdf?id=I1519673917344 var booklet = req.query['booklet'] // e.g. http://localhost:30

使用以下代码,当请求
/pdf
时,express将停止服务所有其他页面,直到生成pdf。如何使PDF生成同步?谢谢

app.get('/pdf', function (req, res) {
  var publication_id = req.query['id'] // e.g. http://localhost:3000/pdf?id=I1519673917344
  var booklet = req.query['booklet'] // e.g. http://localhost:3000/pdf?id=I15196739173440&booklet=true

  const canvasWidth = 450
  const canvasHeight = 636
  const pageWidth = canvasWidth/1.34
  const pageHeight = canvasHeight/1.34

  var canvases = []
  var _publication

  const tasks = [
    function findPublication(callback) {
      Publication.findOne({ 'id': publication_id }, function (err, publication) {
        if (err) return console.error(err)
          _publication = publication
        console.log('found pub')
        callback(null)
      })
    },
    function makeCanvases(callback) {
      for (var i = 1; i < 9; i++) {
        var canvas = new fabric.StaticCanvas('c') // random name
        canvas.setWidth(canvasWidth)
        canvas.setHeight(canvasHeight)
        if ( _publication && _publication.pages.hasOwnProperty('p' + i) ) { // if not empty
          var pages = _publication.pages
          canvas.loadFromJSON(pages['p' + i]);
        }
        canvases.push(canvas)
      }
      console.log('made canvases')
      callback(null)
    },
    function makePdf(callback) {


      res.writeHead(200, {
        'Content-Type': 'application/pdf',
        'Access-Control-Allow-Origin': '*',
        'Content-Disposition': 'filename=' + publication_id + '.pdf'
      });

      if (booklet != 'true') {

        doc = new PDFDocument({size:[pageWidth, pageHeight]})
        var i = 0

        canvases.forEach(function(canvas) {
          SVGtoPDF(doc, canvas.toSVG(), 0, 0, {fontCallback: fonts })
          if (i != canvases.length - 1) {
            doc.addPage()
          }
          i++
        })

        doc.pipe(res).on('finish', function() {
          console.log('single page pdf was successfully created')
        })

        doc.end()

      } else {

        doc = new PDFDocument({size:[pageWidth*2, pageHeight]})

        // all the -1 to have a normal page number
        SVGtoPDF(doc, canvases[8-1].toSVG(), 0, 0, {fontCallback: fonts });
        SVGtoPDF(doc, canvases[1-1].toSVG(), pageWidth, 0, {fontCallback: fonts });
        doc.addPage()
        SVGtoPDF(doc, canvases[2-1].toSVG(), 0, 0, {fontCallback: fonts });
        SVGtoPDF(doc, canvases[7-1].toSVG(), pageWidth, 0, {fontCallback: fonts });
        doc.addPage()
        SVGtoPDF(doc, canvases[6-1].toSVG(), 0, 0, {fontCallback: fonts });
        SVGtoPDF(doc, canvases[3-1].toSVG(), pageWidth, 0, {fontCallback: fonts });
        doc.addPage()
        SVGtoPDF(doc, canvases[4-1].toSVG(), 0, 0, {fontCallback: fonts });
        SVGtoPDF(doc, canvases[5-1].toSVG(), pageWidth, 0, {fontCallback: fonts });

        doc.pipe(res).on('finish', function() {
          console.log('booklet pdf was successfully created')
        })

        doc.end()

      }
    }
  ]

  async.series(tasks, (err) => {
      if (err) {
          return next(err);
      }
  })

  console.log('serving pdf')

})
app.get('/pdf',函数(req,res){
var publication_id=req.query['id']//例如。http://localhost:3000/pdf?id=I1519673917344
var booklet=req.query['booklet']//例如。http://localhost:3000/pdf?id=I15196739173440&booklet=true
常数画布宽度=450
常数画布高度=636
常量页面宽度=画布宽度/1.34
常量页面高度=画布高度/1.34
var画布=[]
var\u出版物
常量任务=[
函数findPublication(回调){
Publication.findOne({'id':Publication\u id},函数(err,Publication){
如果(错误)返回控制台。错误(错误)
_发布=发布
console.log('found pub')
回调(空)
})
},
函数makecanvas(回调){
对于(变量i=1;i<9;i++){
var canvas=new fabric.StaticCanvas('c')//随机名称
canvas.setWidth(canvasWidth)
canvas.setHeight(canvasHeight)
if(_publication&&_publication.pages.hasOwnProperty('p'+i)){//如果不是空的
var pages=\u publication.pages
loadFromJSON(pages['p'+i]);
}
画布。推(画布)
}
console.log(“制作画布”)
回调(空)
},
函数makePdf(回调){
文书标题(200{
“内容类型”:“应用程序/pdf”,
“访问控制允许来源”:“*”,
“内容处置”:“文件名=”+出版物id+”.pdf”
});
如果(小册子!=“正确”){
doc=新PDFDocument({size:[pageWidth,pageHeight]})
变量i=0
canvases.forEach(函数(canvas){
SVGtoPDF(doc,canvas.toSVG(),0,0,{fontCallback:fonts})
if(i!=canvases.length-1){
doc.addPage()
}
我++
})
文件管道(res).on('finish',function()){
console.log('已成功创建单页pdf')
})
文件末尾()
}否则{
doc=新PDFDocument({size:[pageWidth*2,pageHeight]})
//所有的-1都必须有一个正常的页码
SVGtoPDF(doc,canvases[8-1].toSVG(),0,0,{fontCallback:fonts});
SVGtoPDF(doc,canvases[1-1].toSVG(),pageWidth,0,{fontCallback:fonts});
doc.addPage()
SVGtoPDF(doc,canvases[2-1].toSVG(),0,0,{fontCallback:fonts});
SVGtoPDF(doc,canvases[7-1].toSVG(),pageWidth,0,{fontCallback:fonts});
doc.addPage()
SVGtoPDF(doc,canvases[6-1].toSVG(),0,0,{fontCallback:fonts});
SVGtoPDF(doc,canvases[3-1].toSVG(),pageWidth,0,{fontCallback:fonts});
doc.addPage()
SVGtoPDF(doc,canvases[4-1].toSVG(),0,0,{fontCallback:fonts});
SVGtoPDF(doc,canvases[5-1].toSVG(),pageWidth,0,{fontCallback:fonts});
文件管道(res).on('finish',function()){
console.log('小册子pdf已成功创建')
})
文件末尾()
}
}
]
异步系列(任务,(错误)=>{
如果(错误){
返回下一个(错误);
}
})
console.log('serving pdf')
})