मुझे एक समस्या हो रही है, जब मुझे pipe() बनाए गए दस्तावेज़ को कई लक्ष्यों के लिए, मेरे मामले में एक HTTP प्रतिक्रिया और node-mailer का उपयोग करके एक ईमेल अनुलग्नक के लिए करना है। किसी ईमेल के अनुलग्नक में पहली बार उपयोग करने के बाद, प्रतिक्रिया के लिए कुछ भी पाइप नहीं किया जाता है (क्लाइंट से इसे कॉल करते समय, पीडीएफ में 0 बाइट्स होते हैं)।

प्रतिक्रिया नियंत्रक:

const doc = await createPdf(course.name, lastRecordDate, ctx);   

// Send a notificiation email with attachment
if (query.hasOwnProperty('sendEmail') && query.sendEmail === 'true') {
  await sendNotificationEmail(doc, course, ctx);   
}

doc.pipe(res);
res.contentType('application/pdf');

ईमेल भेजने का कार्य:

async function sendNotificationEmail(doc: any, course: Course, ctx: Context) {
  const attachment = {
    filename: `${course.name}-certificate.pdf`,
    contentType: 'application/pdf',
    content: doc
  };
  return SMTPSendTemplateWithAttachments(
    ctx,
    ['somememail@test.si'],
    `${course.name}`,
    'en-report-created',
    {
      firstName: ctx.user.firstName,
      courseName: course.name
    },
    [attachment]
  );
}

अगर मैं एक ईमेल भेजने के लिए फ़ंक्शन को हटा देता हूं, तो पीडीएफ सामान्य रूप से एक प्रतिक्रिया के लिए पाइप हो जाता है और मैं इसे क्लाइंट से डाउनलोड कर सकता हूं।

मैंने स्ट्रीम को क्लोन करने का एक तरीका खोजने की कोशिश की (PDFKit का दस्तावेज़ एक स्ट्रीम है जहाँ तक मुझे पता है), लेकिन असफल रहा।

कोई समाधान वास्तव में सहायक होगा।

5
AndrejH 18 जुलाई 2019, 16:48

1 उत्तर

सबसे बढ़िया उत्तर

मैंने दो PassThrough स्ट्रीम दो का उपयोग करके समस्या को हल किया, जिसे मैंने PDFKitदस्तावेज़ Stream को पाइप किया, फिर data ईवेंट पर मैंने chunks को दो अलग-अलग बफ़र्स में लिखा . end ईवेंट पर मैं एक ईमेल के साथ डेटा भेजता हूं और एक नई PassThrough स्ट्रीम बनाता हूं और इसे प्रतिक्रिया के लिए पाइप करता हूं।

यहाँ कोड है।

// Both PassThrough streams are defined before in order to use them in the createPdf function
streamCopy1 = new PassThrough();
streamCopy2 = new PassThrough();

const buffer1 = [];
const buffer2 = [];

streamCopy1
  .on('data', (chunk) => {
    buffer1.push(chunk);
  })
  .on('end', () => {
    const bufferFinished = Buffer.concat(buffer1);
    if (query.hasOwnProperty('sendEmail') && query.sendEmail === 'true') {
      sendNotificationEmail(bufferFinished, course, ctx);
    }
  });

streamCopy2
  .on('data', (chunk) => {
    buffer2.push(chunk);
  })
  .on('end', () => {
    const bufferFinished = Buffer.concat(buffer2);
    const stream = new PassThrough();
    stream.push(bufferFinished);
    stream.end();
    stream.pipe(res);
    res.contentType('application/pdf');
  });

पीडीएफ बनाने का कार्य।

// function declaration
const doc = new pdfDocument();
doc.pipe(streamCopy1).pipe(streamCopy2);
// rest of the code

समाधान वास्तव में सबसे अच्छा नहीं है, किसी भी सुझाव का बहुत स्वागत है।

0
AndrejH 22 जुलाई 2019, 12:14