2017-08-29 31 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

就是這樣。萬分感謝! –