0

busboyを使用して、node.js と express.js でファイル共有プラットフォームを開発しています。

現時点では問題なく動作しますが、大きなファイルをアップロードしています。

その場合、大きなファイルがアップロードされている間、サーバーは新しいリクエストを受け入れません。

私は普通ですか?もしそうなら、アップロードにもっと時間がかかることを意味するとしても、この動作を改善する方法...

今のところ、ubuntu のかなり良い PC (asus i7/8G) の localhost で開発とテストを行っています。

大きなファイルのアップロードを開始し、新しいタブを開いてアプリに移動すると、アップロードが完了したときにのみタブが読み込まれます。

アプリケーションの読み込み:

var app = express();

//...

app.use(bodyParser.urlencoded({
    extended: true
}));
app.use(bodyParser.json());
app.use(methodOverride());

// Request multipart parsing middleware
app.use(busboy());

// default options, immediately start reading from the request stream and 
// parsing 
app.use(busboy({ immediate: true }));

私のアップロード方法files controller

exports.create = function(req, res) {

    var _file = new File(req.body);

    req.busboy.on('file', function(fieldname, file, filename, encoding, mimetype) {

        file.on('data', function(data) {
            _file.data += data;
        });
        file.on('end', function() {
            _file.save(function(err) {
                if (err) {
                    console.error(err);
                    return res.status(500).send({
                        message: errorHandler.getErrorMessage(err)
                    });
                } else {
                    // doing some stuff on save
                }
            });
        });
    });

    // req.busboy.on('field', function(key, value, keyTruncated, valueTruncated) {
    //  console.log('Field [' + key + ']: value: ' + value);
    // });
    // req.busboy.on('finish', function() {
    //  console.log('Done parsing form!');
    // });

    req.pipe(req.busboy);
};
4

1 に答える 1

1

ここには、少なくともいくつかの問題があります。

  • busboy2回ロードされています。app.use(busboy({ immediate: true }));から行を削除する必要がありますapp.js
  • 次に、すべてのファイル全体がメモリにバッファリングされます ( )。代わりに、ファイルをディスク、Amazon の S3 などのネットワーク ストレージ サービス、またはプロセス外の他の場所のどこかにストリーミングする必要があります。_file.data += data;
  • これは、ストリーミングに切り替えると実際には問題になりますが、技術的には、現在のバッファリング コードでは、同じFileオブジェクトが要求全体に使用されているため、複数のファイルを連結しています。ファイルが 1 つしか送信されないことが確実にわかっている場合 (たとえば、自分が常にクライアントである場合) は、おそらく問題にはなりませんが、注意が必要です。
于 2015-07-19T23:12:24.023 に答える