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()调用时公开 Formidable 表单对象,而无需等待表单的“结束”事件。如果您需要绑定到“进度”事件,此选项很有用。

因此,您所要做的就是defer在初始化正文解析器时将 set 设置为 true,然后您就可以progress监听req.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 回答
-1

我认为没有与 express req 对象绑定的任何数据事件。你在哪里看到的?

此外,尝试在您用于上传的表单上添加此内容:

enctype="multipart/form-data"
于 2013-08-24T22:53:36.433 回答