2016-07-20 9 views
-1

SFTB、リクエストがサーバーに来てmultipart/form-dataとなっています。その要求からファイルの内容を取得します。Node.jsストリーム: - ストリームファンクションが同じファイルに対して2回目の呼び出しではありません

私はstreamsを介して供給されたファイルとcvsParserに我々はカスタムにhttpを使用して、リソースのフェッチTransform機能をコンテンツに渡していることをやった後csv-streamifyだけのインスタンスである配管を読んでいます[私はそのためgotを使用しています]それを取得した後、私は画像を圧縮しています。

問題は、最初にファイルを送信するときに魅力的ですが、同じファイルを2回提出しようとすると、stream部分をスキップして、直接finishイベントハンドラにジャンプします。初めて

ログ -

Submitting 
Converting image at C:\image-minifier-sqd\build\src\1469004088476.bell.svg 
Build is present at build\dest\1469004088476.bell.svg 
Converting image at C:\image-minifier-sqd\build\src\1469004088996.mail.svg 
Build is present at build\dest\1469004088996.mail.svg 
Finished 

ログiが同じファイルを送信する第二時間[フロントエンドにリフレッシュ付きおよびなしの両方]

Submitting 
Finished 

FYI、フロントエンドIにfetch APIを使用してPOSTリクエストを作成しています。

マイServerコード: -

function createParser() { 
    var parser = new Transform({objectMode: true}); 
    parser._transform = function(data, encoding, done) { 
    const date = new Date(); 
    const link = data.toString().slice(2,-3); 
    const fileName = date.getTime()+ '.' +link.split('/').pop(), 
      filePath = path.resolve(__dirname,`build/src/${fileName}`); 
    got.stream(link) 
    .pipe(fs.createWriteStream(filePath,{flags:'a'})) 
    .on('close',_ => { 
     console.log(`Converting image at ${filePath}`) 
     //Compressing images 
     imagemin([filePath],'build/dest',{ 
     plugins: [ 
      imageminMozjpeg(), 
      imageminPngquant({speed: 10}), 
      imageminSvgo(), 
      imageminGifsicle() 
     ] 
     }) 
     .then(file => { 
     console.log(`Build is present at ${file[0].path}`); 
     this.push(file[0].path); 
     done(); 
     }); 
    }); 
    }; 

    return parser; 
} 
//A request comes here with multipart/form-data 
app.post('/submit/csv',upload.array('data'),(req, res) => { 
    console.log('Submitting') 
    const stream = fs.createReadStream(path.resolve(__dirname,req.files[0].path)) 
        .pipe(csvParser) 
        .pipe(createParser()) 
        .pipe(res) 
        .on('finish',_ => { 
        log('Finished'); 
        res.end(); 
        }); 

}); 

感謝。

+0

なぜdownvotedですか? :o –

答えて

1

私は問題がcsvParserの再利用に関連していると思います。代わりに、関数内で使用してcsvParserの作成を包むようにしてください:

function createCsvParser() { 
    const parser = csv(); 
    parser.on('data', function (line) { 
     [...] 
    }); 
    return parser; 
} 

.pipe(createCsvParser()).pipe(csvParser)を変更。

これが役に立ちます。

+0

問題の原因は何でしょうか? –

+0

これは、ストリームが保持しなければならない状態に関連していると推測します。 – vincent

+0

おかげで助けになりました。 :D –

関連する問題