2017-08-29 1 views
0

Ich benutze pdfkit und kann erfolgreich ein pdf zu S3 einmal hochladen. Aber wenn es ein zweites Mal versucht wird, löst es diesen Fehler aus.Fehler: Schreiben Sie nach dem Ende mit 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) 

Ich bin mir nicht sicher, was diesen Fehler verursacht. Hier ist mein Code server

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 
    }); 
    }); 
}); 

es etwas mit doc.end zu tun hat() aber ich bin nicht sicher, was genau. Hier ist mein Client-Code, der die Anfrage stellt.

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() 
    } 

Wer weiß, wie ich das beheben kann?

+0

Ihr Dokument ist global, ich glaube nicht, dass Sie es nach dem Anruf beenden können. Versuchen Sie, ein neues PDF in Ihrem Handler zu haben. – T4rk1n

Antwort

2

Es ist wahrscheinlich, weil Sie doc als global erstellen. Verschieben var doc = new pdf; kurz vor doc.fontSize(21) und es sollte funktionieren.

Das Problem ist - auf erste Anfrage - pdf ist instancied und ein geschlossen (mit doc.end()). Auf zweite Anfrage können Sie nicht in pdf schreiben, weil es bereits geschlossen ist (wie es nicht im Zusammenhang mit der aktuellen Anfrage war)

+0

Das war es. Danke vielmals! –