无法使用存储在快速会话中的引用写入流

Unable to write to the stream using the reference stored in express-session

在我的项目中,我使用 blueimp jQuery-File-Upload plugin 将一个几 GB 的大文件以块的形式上传到服务器 - 一次 10MB 块。

我在 Node.js 后端有一个 writeStream 附加到 express-session,这样从 2 个不同用户上传的文件就不会搞砸了。我为每次上传创建一个 writeStream 并将其附加到会话中。

问题是,当后端接收到第一个数据块时,在会话中找不到writeStream.write

我的相关部分Node.js/Express.js代码:

// session config:
expressApp.use(session({
    genid: function(req) {
        return uuidV1();
    },
    secret: '***',
    resave: true,
    saveUninitialized: true,
    cookie: { secure: false }
}));

// create writeStream
expressApp.post('/createStream', function(request, response) {

    request.session.wstream = fileSystem.createWriteStream(uploadsDirectoryLocation + '/' + request.body.fileName);

    request.session.wstream.on('finish', function() {
        console.log('*********************************** file has been written ***********************************');
    });

    response.send({ response: 'success' });

});


// on every chunk received, write to the stream
expressApp.post('/uploadFile', function(request, response) {

    var size = 0;

    console.log(request.session.wstream);  // the attached 'wstream' does show up

    request.on('data', function(data) {
        size += data.length;

        request.session.wstream.write(data);  // app crashes here

        console.log('Got chunk: ' + data.length + ' total: ' + size);
        console.log('data', data);
    });

    request.on('end', function() {
        console.log("total size = " + size);
        response.send("response");
    });

    request.on('error', function(e) {
        console.log("ERROR: " + e.message);
        response.send("response");
    });

});

// close the stream
expressApp.post('/closeStream', function(request, response) {

    request.session.wstream.end();

    response.send({ response: 'success' });

});

准确的错误是:

        streamObj.wstream.write(data);
                         ^

TypeError: Cannot read property 'write' of undefined

我在这里做错了什么?

编辑:

但是,如果我没有将 writeStream 附加到会话并使其保持全局,它确实可以工作。但是,不适用于不同的会话。

我该如何解决这个问题?

I head back from one of the express-session repo maintainers on GitHub:

The reason is that the data in req.session is saved to the database using JSON.stringify, and functions cannot be represented in there. You can only store simple values like numbers and strings in req.session, not complex functions, unfortunately.

我通过完全消除 writeStream 并使用 openSync 创建一个空文件并使用 appendFileSync 将数据附加到接收到的每个块上的文件来解决问题。