2017-08-29 55 views
0

使用pdfkit并且可以成功将pdf上传到S3一次。但如果再次尝试,则会引发此错误。错误:使用pdfkit结束后写入

Error: write after end 
    at writeAfterEnd (_stream_writable.js:220:12) 
    at PDFReference.Writable.write (_stream_writable.js:271:5) 
    at PDFPage.write (/Users/jonathancorrin/Desktop/workspace/rent-app/node_modules/pdfkit/js/page.js:95:27) 
    at PDFDocument.addContent (/Users/jonathancorrin/Desktop/workspace/rent-app/node_modules/pdfkit/js/document.js:161:17) 
    at PDFDocument.save (/Users/jonathancorrin/Desktop/workspace/rent-app/node_modules/pdfkit/js/mixins/vector.js:19:19) 
    at PDFDocument._fragment (/Users/jonathancorrin/Desktop/workspace/rent-app/node_modules/pdfkit/js/mixins/text.js:257:12) 
    at PDFDocument._line (/Users/jonathancorrin/Desktop/workspace/rent-app/node_modules/pdfkit/js/mixins/text.js:203:12) 
    at emitThree (events.js:140:20) 
    at LineWrapper.emit (events.js:216:7) 
    at /Users/jonathancorrin/Desktop/workspace/rent-app/node_modules/pdfkit/js/line_wrapper.js:141:17 
    at LineWrapper.wrap (/Users/jonathancorrin/Desktop/workspace/rent-app/node_modules/pdfkit/js/line_wrapper.js:207:9) 
    at PDFDocument._text (/Users/jonathancorrin/Desktop/workspace/rent-app/node_modules/pdfkit/js/mixins/text.js:48:17) 
    at PDFDocument.text (/Users/jonathancorrin/Desktop/workspace/rent-app/node_modules/pdfkit/js/mixins/text.js:59:19) 
    at /Users/jonathancorrin/Desktop/workspace/rent-app/server/routes/image-upload.js:36:6 
    at Layer.handle [as handle_request] (/Users/jonathancorrin/Desktop/workspace/rent-app/node_modules/express/lib/router/layer.js:95:5) 
    at next (/Users/jonathancorrin/Desktop/workspace/rent-app/node_modules/express/lib/router/route.js:137:13) 
    at Route.dispatch (/Users/jonathancorrin/Desktop/workspace/rent-app/node_modules/express/lib/router/route.js:112:3) 
    at Layer.handle [as handle_request] (/Users/jonathancorrin/Desktop/workspace/rent-app/node_modules/express/lib/router/layer.js:95:5) 
    at /Users/jonathancorrin/Desktop/workspace/rent-app/node_modules/express/lib/router/index.js:281:22 
    at Function.process_params (/Users/jonathancorrin/Desktop/workspace/rent-app/node_modules/express/lib/router/index.js:335:12) 
    at next (/Users/jonathancorrin/Desktop/workspace/rent-app/node_modules/express/lib/router/index.js:275:10) 
    at Function.handle (/Users/jonathancorrin/Desktop/workspace/rent-app/node_modules/express/lib/router/index.js:174:3) 
    at router (/Users/jonathancorrin/Desktop/workspace/rent-app/node_modules/express/lib/router/index.js:47:12) 
    at Layer.handle [as handle_request] (/Users/jonathancorrin/Desktop/workspace/rent-app/node_modules/express/lib/router/layer.js:95:5) 
    at trim_prefix (/Users/jonathancorrin/Desktop/workspace/rent-app/node_modules/express/lib/router/index.js:317:13) 
    at /Users/jonathancorrin/Desktop/workspace/rent-app/node_modules/express/lib/router/index.js:284:7 
    at Function.process_params (/Users/jonathancorrin/Desktop/workspace/rent-app/node_modules/express/lib/router/index.js:335:12) 
    at next (/Users/jonathancorrin/Desktop/workspace/rent-app/node_modules/express/lib/router/index.js:275:10) 

我不确定是什么原因导致此错误。这里是我的服务器端代码

var express = require('express'); 
var router = express.Router(); 
var aws = require('aws-sdk'); 
var fs = require('fs'); 
var path = require('path'); 
var path3 = path.join(__dirname, "../config/config-aws.json"); 
var pdf = require('pdfkit'); 
var multer = require('multer'); 
var multerS3 = require('multer-s3'); 
var doc = new pdf; 

aws.config.loadFromPath(path3); 
var s3 = new aws.S3(); 
var fileName = ''; 
var uploadM = multer({ 
    storage: multerS3({ 
    s3: s3, 
    bucket: 'XXXX', 
    acl: 'public-read', 
    metadata: function (req, file, cb) { 
     cb(null, {fieldName: file.fieldname}); 
    }, 
    key: function (req, file, cb) { 
     fileName = Date.now().toString() + "-" + (Math.round(Math.random() * 10000000000000000)).toString() + '-' + file.originalname; 
     cb(null, fileName) 
    } 
    }) 
}); 





router.post('/upload/contract', function (req,res) { 
    doc.fontSize(21) 
    .text(req.body.contractType, 240, 50); 
    doc.fontSize(15) 
    .text(req.body.text, 100, 100) 
    .text(req.body.text2, 100, 280); 
    doc.end(); 

    var params = { 
    Key: req.body.fileName, 
    Body: doc, 
    Bucket: 'XXXX', 
    ACL: 'public-read', 
    contentType: 'application/pdf' 
    }; 
    s3.upload(params, function (err, response) { 
    if (err) { 
     return res.status(400).json({ 
     message: "Error uploading pdf", 
     error: err.stack 
     }); 
    } 
    return res.status(200).json({ 
     title: "PDF uploaded successfully", 
     obj: response 
    }); 
    }); 
}); 

它与doc.end()有关,但我不知道究竟是什么。 这是我提出请求的客户端代码。

onReturnPDF(html: string, fileName: string, contractType: string, html2: string) { 
    const body = { 
     fileName: fileName, 
     text: html, 
     contractType: contractType, 
     text2: html2 
    }; 
    return this.http.post(this.devUrl + '/upload/contract', body) 
     .shareReplay() 
    } 

任何人都知道我该如何解决这个问题?

+0

您的文档是全球性的,我认为您可以在调用结束后润饰它。尝试在你的处理程序中使用新的pdf。 – T4rk1n

回答

2

其可能是因为您正在创建doc作为全球。移动 var doc = new pdf;就在doc.fontSize(21)之前,它应该工作。

问题是 - 第一次请求 - pdf是instancied和关闭(与doc.end())。在第二次请求中,您不能写入pdf,因为它已经关闭(因为它在当前请求的上下文中没有被禁止)

+0

就是这样。万分感谢! –