0

Busboy からファイル ストリームを取得し、それをカスタム トランスフォーム ストリームにパイプして、検証とクリーニングを行います。小さなファイルで動作しますが、ファイルが大きくなると、カスタム ストリームは busboy ストリームが終了するのを待たずに切り捨てられます。

バスボーイコードは次のとおりです。

busboy
.on("file", function(fieldname, file, filename, encoding, mimetype) {
    //Creating a mongo doc first
    Dataset.create(dataset, function (err, ds) {
        if(err) {...} 
        else {
            file.pipe(validateCSV));
        }
    });

    validateCSV
        .on("finish", function() {
            // Send to Data Import
            datasetService.import(validateCSV, dataset, function (err, result) {
                ...
            });
        });
});

そして私の変換ストリーム:

module.exports.ValidateCSV = ValidateCSV;
function ValidateCSV(options) {
    if (!(this instanceof ValidateCSV)) return new ValidateCSV(options);

    if (!options) options = {};
    options.objectMode = true;
    Transform.call(this, options);
}

util.inherits(ValidateCSV, Transform);

ValidateCSV.prototype._transform = function (chunk, encoding, done) {
    if (this._checked) {
        this.push(chunk);
    } else {
        //Do some validation
        var data = chunk.toString();
        var lines = data.match(/[^\r\n]+/g);
        var headerline = lines[0] || "";
        var header = headerline.split(",");
        ...
        this._checked = true;
        this.push(chunk);
    }
    done()
}
4

1 に答える 1

0

これはバックプレッシャの問題であることが判明し、変換ストリームで HighWaterMark オプションを確認することで修正されました。理想的には、アップロードのファイルサイズに応じて設定する必要がありますが、これで修正されました。

function ValidateCSV(options) {
    if (!(this instanceof ValidateCSV)) return new ValidateCSV(options);

    if (!options) options = {};
    options.objectMode = true;
    options.highWaterMark = 100000;
    Transform.call(this, options);
}
于 2016-02-18T12:50:52.217 に答える