Node JS -J2EE WriteStream

s3fp2yjn  于 12个月前  发布在  Node.js
关注(0)|答案(1)|浏览(99)

我要疯了,试图修复这个bug,所以请帮助:-)我正在使用https://pdfkit.org/
这将创建一个流,完成后将通过管道传输到fs。
我的问题是代码第一次运行时,这个工作并生成PDF。下一次代码运行时,创建了一个文件,并创建了零错误。我正在从运行在express上的API调用该函数。问题似乎是fs. fullWriteStream的JavaScript特性。流在API返回后完成。我似乎无法找到一种方法来阻止,同时确认文件已创建。
奇怪的是,第一次运行代码时,它会失败:
这里是管道函数;

async function _writeFile(fileObj) {

    let fileStream = fs.createWriteStream(fileObj.fileName)

    pipeline(
        doc,
        fileStream,
        async (err) => {
            if (err) {
                console.error('PDF failed', err);
                return ('Pipeline failed', err)
            } else {
                console.log('PDF succeeded');

            }
        }

    )

}

字符串
这被称为:

exports.drawReport = async (payload) => {

    var date = new Date();
    const timeStamp = date.toJSON();
    let path = './controllers/tmp/'
    var fileName = path + timeStamp + '.' + payload.type + '.pdf'

    try {

        // Start Report 
        await _startReport(payload)

        // Check Starting position on page & add status box header
        if (device_card_reference == 260) {
            await _deviceTitle(payload);
        }

        // Add Devices
        await _reportDevice(payload);

        // Call Footer for final page
        await _reportFooter()

        console.log("PDF Done - Writing File")

        // File Meta Data
        let fileObj = {
            type: payload.type,
            siteId: payload.siteId,
            fileName: fileName,
            timeStamp: timeStamp

        }

        // Create file to store PDF
        await _writeFile(fileObj)

        doc.end()
        console.log("PDF MADE?")

        return (fileObj)

    } catch (err) {
        console.error('MakePDF ERROR: ' + err.message);
        return (err.message)
    }

}

2vuwiymt

2vuwiymt1#

pipeline异步运行,因此不会等待,这就是为什么doc.end()在文件完成之前运行
尝试在promise中 Package pipeline,然后在流完成时解析:

// function that returns a promise
function _writeFile(fileObj) {

    return new Promise((resolve, reject) => {

        const fileStream = fs.createWriteStream(fileObj.fileName);

        pipeline(
            doc,
            fileStream,
            async(err) => {
                if (err) {
                    console.error('PDF failed', err);
                    // err, handle in `.catch`
                    reject({res:'Pipeline failed', err});
                } else {
                    console.log('PDF succeeded');
                    // done, resolve, to move to doc.end
                    resolve('PDF succeeded');

                }
            }

        )
    });
}

字符串
添加.catch()来处理错误:

// Create file to store PDF
await _writeFile(fileObj).catch(err => console.log(err));


或者更好,使用流承诺API

const {pipeline } = require('stream/promises');

async function _writeFile(fileObj) {

    const fileStream = fs.createWriteStream(fileObj.fileName);

    await pipeline(doc, fileStream);

    console.log('PDF succeeded');

}

相关问题