首页 > 解决方案 > How do I close fs.createWriteStream?

问题描述

I am trying to use the node module vtt2srt to convert a VTT string to SRT file and save the output. It works once, and my subtitles are saved correctly, but if I hit the endpoint a second time node crashes with this error:

Error: write after end
at writeAfterEnd 

I have tried all combinations of .close .on('close')

I send a unique vid and the VTT data from the frontend

router.post('/downloadsubs', function(req,res,next) {
    var vttObj = webvtt.compile(req.body.data);

    fs.unlink(__dirname + '/../static/videos/'+req.body.vid+'/subtitles.srt', function(){
        srtStream.write(vttObj);
        var writestream = fs.createWriteStream(__dirname + '/../static/videos/'+req.body.vid+'/subtitles.srt')
        srtStream.end()
        srtStream.pipe(writestream)
        res.send(req.body.vid);
    }) 
})

标签: node.jsfs

解决方案


我解决了我的问题,希望有一天它对其他人有用。

以前我需要我的模块在我的路由器文件的开头:

const vtt2srt = require('node-vtt-to-srt');
const srtStream = vtt2srt();

router.post('/downloadsubs', function(req,res,next) {
    var vttObj = webvtt.compile(req.body.data);

    fs.unlink(__dirname + '/../static/videos/'+req.body.vid+'/subtitles.srt', function(){
        srtStream.write(vttObj);
        srtStream.end()
        var writestream = fs.createWriteStream(__dirname + '/../static/videos/'+req.body.vid+'/subtitles.srt');
        srtStream.pipe(writestream)
        writestream.on('finish', function () { res.send(req.body.vid) });
    })
})

现在,相反,我在路由器方法中创建了一个新的 srtStream:

const vtt2srt = require('node-vtt-to-srt');

router.post('/downloadsubs', function(req,res,next) {
    var srtStream = vtt2srt();
    var vttObj = webvtt.compile(req.body.data);

    fs.unlink(__dirname + '/../static/videos/'+req.body.vid+'/subtitles.srt', function(){
        srtStream.write(vttObj);
        srtStream.end()
        var writestream = fs.createWriteStream(__dirname + '/../static/videos/'+req.body.vid+'/subtitles.srt');
        srtStream.pipe(writestream)
        writestream.on('finish', function () { res.send(req.body.vid) });
    })
})

它有效。


推荐阅读