无法从子进程回调设置会话变量

时间:2016-06-03 12:13:50

标签: node.js session express

我有一个节点/快速应用程序,它调用外部程序,需要捕获输出并处理不同的可能状态。

问题是:我无法在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添加到控制台输出,则值始终相同。

1 个答案:

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