无法使用存储在快速会话中的引用写入流
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
将数据附加到接收到的每个块上的文件来解决问题。
在我的项目中,我使用 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 usingJSON.stringify
, and functions cannot be represented in there. You can only store simple values like numbers and strings inreq.session
, not complex functions, unfortunately.
我通过完全消除 writeStream
并使用 openSync
创建一个空文件并使用 appendFileSync
将数据附加到接收到的每个块上的文件来解决问题。