【问题标题】:Unable to write to the stream using the reference stored in express-session无法使用存储在快速会话中的引用写入流
【发布时间】:2017-07-15 18:56:40
【问题描述】:

在我的项目中,我使用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 附加到会话并保持全局,它确实有效。但是,不适用于不同的会话。

我该如何解决这个问题?

【问题讨论】:

  • 为什么投反对票?

标签: javascript node.js session express express-session


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2016-10-21
    • 2015-07-05
    • 2022-01-26
    • 2016-07-06
    • 2017-11-26
    • 2020-10-20
    • 1970-01-01
    • 1970-01-01
    • 2020-08-11
    相关资源
    最近更新 更多