我有一个节点/快速应用程序,它调用外部程序,需要捕获输出并处理不同的可能状态。
问题是:我无法在on(数据)回调中设置会话状态。
处理呼叫的功能是:
app.get('/test/:script', function(req, res) {
if (req.session.state != SessionState.STARTED) {
req.session.state = SessionState.STARTED;
req.session.scriptname = req.params.script;
req.session.outputText = '';
var test = spawn('./Test', [ req.session.scriptname ]);
test.stdout.on('data', function(data) { console.log('+++' + JSON.stringify(req.session)); req.session.outputText += data.toString() + '<br/>'; });
test.on('close', function(code) { console.log('---' + JSON.stringify(req.session)); console.log(code); req.session.state = SessionState.FINISHED; });
}
res.redirect(301, '/');
})
默认路线是:
app.get('/', function (req, res) {
var responseBody = '';
var responseHead = '';
switch (req.session.state) {
case undefined:
case SessionState.IDLE:
var files = fs.readdirSync('../input')
for (var i = 0; i < files.length; i++) {
var fname = files[i];
responseBody += '<a href="/test/' + fname + '">' + fname + '</a> <br/>';
}
req.session.state = SessionState.IDLE;
break;
case SessionState.STARTED:
responseHead += '<meta http-equiv="refresh" content="2">';
responseBody += req.session.outputText;
console.log('***' + JSON.stringify(req.session));
break;
case SessionState.FINISHED:
responseBody += 'Execution finished';
break;
}
var responseText = '<html>' +
'<head>' + responseHead + '</head>' +
'<body>' + responseBody + '</body>' +
'</html>'
res.send(responseText);
})
控制台日志显示完全不同的对象:一个由第一个函数更新,包含我的程序的完整输出,但另一个对象(由第二个函数记录)永远不会改变。
如何确保我始终访问相同的会话对象?如果我将req.sessionID添加到控制台输出,则值始终相同。
答案 0 :(得分:1)
我不确定你指的是哪个console.logs(那里有一些),但是你的问题的一个潜在原因是在子进程完成之前发出了重定向。
这是一个可能的重写:
app.get('/test/:script', function(req, res) {
if (req.session.state != SessionState.STARTED) {
req.session.state = SessionState.STARTED;
req.session.scriptname = req.params.script;
req.session.outputText = '';
var test = spawn('./Test', [ req.session.scriptname ]);
test.stdout.on('data', function(data) {
console.log('+++' + JSON.stringify(req.session));
req.session.outputText += data.toString() + '<br/>';
});
test.on('close', function(code) {
console.log('---' + JSON.stringify(req.session));
console.log(code);
req.session.state = SessionState.FINISHED;
res.redirect(301, '/');
});
} else {
res.redirect(301, '/');
}
})