2017-08-29 5 views
0

Im 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) 

このエラーの原因は不明です。ここに私のサーバーサイドコードそれが正確にわからないdoc.end()が、イムとは何かを持っている

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

です。 リクエストを作成しているクライアント側のコードです

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をグローバルとして作成しているためです。 doc.fontSize(21)の直前に var doc = new pdf;を移動すると正常に動作します。

問題は - 最初のリクエストで - pdfがインスタンス化され、クローズされました(doc.end())。 2番目のリクエストでは、すでに閉じられているため、pdfに書き込むことはできません。(現在のリクエストの状況では異常終了していないので)

+0

それはそれでした。ありがとう、トン! –

関連する問題