如何在NodeJS中将ReadableStream转换为ReadStream?

问题描述 投票:0回答:2

我正在使用nodemailer和pdfmake创建pdf,并将其在电子邮件的附件中发送。我对 NodeJS 中的文件处理没有太多经验,我无法让它工作。

请参阅保存文件的位置示例。当我检查类型时,

createPdfKitDocument
返回
NodeJS.ReadableStream
的扩展。

在 Nodemailer 中,我可以将附件包含为

Stream
Readable
请参阅文档。

但是,我无法在不保存附件的情况下发送附件,并给出文件的路径。

我试图按原样提供从

ReadableStream
返回的
createPdfKitDocument
,这会导致悬而未决的承诺。我尝试用
Readable.from()
包裹它,但没有成功。我尝试对结果调用
.read()
,并没有导致挂起承诺,但无法打开pdf。

有什么想法如何将

ReadableStream
转换为
Readable
Buffer

node.js stream buffer fs
2个回答
5
投票

NodeJS.ReadableStream
类型流用于较旧的 NodeJS 库和版本。您可以使用
wrap
中的
Readable
方法将
NodeJS.ReadableStream
转换为 Readable 流。

const { OldReader } = require('./old-api-module.js');
const { Readable } = require('node:stream');
const oreader = new OldReader(); // will return stream of NodeJS.ReadableStream
const myReader = new Readable().wrap(oreader);

myReader.on('readable', () => {
  myReader.read(); // etc.
});

参考:https://nodejs.org/api/stream.html#stream_read_wrap_stream。有关其他信息,请参阅此 https://nodejs.org/api/stream.html#compatibility-with-older-nodejs-versions


0
投票

当我尝试使用 puppeteer 的 createPDFStream 方法生成 PDF 文件时,这是一个对我有用的解决方案(打字稿),该方法返回

ReadableStream<Uint8Array>


import puppeteer, { Browser } from 'puppeteer';
import { Readable } from 'stream';
import { ReadableStream } from 'stream/web';

/**
 * This function renders HTML contents to a PDF file stream
 * @param html HTML string
 */
async function renderToStream(html: string) {
  let browser: Browser;

  try {
    browser = await puppeteer.launch();
    const page = await browser.newPage();

    await page.setContent(html).catch(() => browser.close());

    const webStream = await page.createPDFStream();

    const nodeStream = Readable.fromWeb(webStream as ReadableStream<any>);

    nodeStream.on('end', () => browser.close());

    return nodeStream;
  } catch (err) {
    console.error('PDF rending to stream failed: ', err);

    if (browser) {
      browser.close();
    }
  }
}


© www.soinside.com 2019 - 2024. All rights reserved.