Javascript 无法使用存储在express会话中的引用写入流

Javascript 无法使用存储在express会话中的引用写入流,javascript,node.js,session,express,express-session,Javascript,Node.js,Session,Express,Express Session,在我的项目中,我正在将一个只有几GB的大文件上传到服务器上,分块—每次10MB,使用 我在Node.js后端有一个writeStream连接到,这样从两个不同的用户上传的文件就不会搞砸。我为每次上传创建一个writeStream,并将其附加到会话 问题是,当在后端接收到第一个数据块时,会话中找不到writeStream.write 我的Node.js/Express.js代码的相关部分: // session config: expressApp.use(session({ genid:

在我的项目中,我正在将一个只有几GB的大文件上传到服务器上,分块—每次10MB,使用

我在Node.js后端有一个
writeStream
连接到,这样从两个不同的用户上传的文件就不会搞砸。我为每次上传创建一个
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
我做错了什么

编辑:

// 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' });

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

如何修复此问题?

原因是
req.session
中的数据是使用
JSON.stringify
保存到数据库的,其中无法表示函数。不幸的是,您只能在
req.session
中存储简单的值,如数字和字符串,而不能存储复杂的函数


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

为什么否决?