0

ファイルのアップロードを受け取る ExpressJS アプリを考えてみましょう。

app.post('/api/file', function(req, res) {
    req.on('data', function() {
        console.log('asd')
    })
})

データ イベントが発生しない理由がわかりません。私は bodyParser() ミドルウェアも使用しています。これは、いくつかのイベントが利用可能であるが、まだ効果がないように見える各ファイルに対して次のオブジェクトを提供します:

{
    file: {
        domain: null,
        _events: {},
        _maxListeners: 10,
        size: 43330194,
        path: 'public/uploads/a4abdeae32d56a2494db48e9b0b22a5e.deb',
        name: 'google-chrome-stable_current_amd64.deb',
        type: 'application/x-deb',
        hash: null,
        lastModifiedDate: Sat Aug 24 2013 20: 59: 00 GMT + 0200(CEST),
        _writeStream: {
            _writableState: [Object],
            writable: true,
            domain: null,
            _events: {},
            _maxListeners: 10,
            path: 'public/uploads/a4abdeae32d56a2494db48e9b0b22a5e.deb',
            fd: null,
            flags: 'w',
            mode: 438,
            start: undefined,
            pos: undefined,
            bytesWritten: 43330194,
            closed: true,
            open: [Function],
            _write: [Function],
            destroy: [Function],
            close: [Function],
            destroySoon: [Function],
            pipe: [Function],
            write: [Function],
            end: [Function],
            setMaxListeners: [Function],
            emit: [Function],
            addListener: [Function],
            on: [Function],
            once: [Function],
            removeListener: [Function],
            removeAllListeners: [Function],
            listeners: [Function]
        },
        open: [Function],
        toJSON: [Function],
        write: [Function],
        end: [Function],
        setMaxListeners: [Function],
        emit: [Function],
        addListener: [Function],
        on: [Function],
        once: [Function],
        removeListener: [Function],
        removeAllListeners: [Function],
        listeners: [Function]
    }
}

進行状況を確認し、イベントを完了する方法を理解したいと思います。

4

2 に答える 2

2

Express でリクエスト オブジェクトとレスポンス オブジェクトにアクセスできる場合、リクエストはすでに終了しており、アップロードも完了しています。したがって、data受信するデータがなくなるため (そして、Jonathan Ong のコメントに従って読み取り可能なストリームが消費されるため)、イベントはもう発生しません。ファイルのアップロードの進行状況を確認する別の方法は、ミドルウェア、特にボディ パーサーを使用することです。

Connect のドキュメントを見ると(Express は Connect 上に構築されているため)、次のように記載されています

defer処理を延期 req.form.next()し、フォームの「終了」イベントを待たずに呼び出されると、フォーミダブル フォーム オブジェクトを公開します。このオプションは、「進行」イベントにバインドする必要がある場合に役立ちます。

したがって、body パーサーを初期化するときに set を true に追加するだけで、 のイベントをdeferリッスンできます。例:progressreq.form

app.use(express.bodyParser({
  defer: true              
}));

app.post('/upload', function (req, res) {
  req.form.on('progress', function (received, total) {
    var percent = (received / total * 100) | 0;
    console.log(percent + '% has been uploaded.');
  });

  req.form.on('end', function() {
    console.log('Upload completed.');
  });
});
于 2013-08-24T23:01:13.217 に答える