Javascript 无法使用存储在express会话中的引用写入流
在我的项目中,我正在将一个只有几GB的大文件上传到服务器上,分块—每次10MB,使用 我在Node.js后端有一个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:
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
在收到的每个区块上向文件追加数据来解决问题。为什么否决?