节点流结束:结束后写入

时间:2018-08-10 08:57:59

标签: javascript python node.js

enter image description here

当我将输入发送到用python编写的子进程时,会遇到错误。 当我第一次发送数据时,它给出了输出,但是在第二次输入时,我给我发送了错误。提示要覆盖的管道在我收到第一个输出之后就结束了。 你能帮助我吗。

这是节点代码。

var bodyParse = require('body-parser');
var urlencodedParser = bodyParse.urlencoded({extended: false});
var spawn = require('child_process').spawn
var py    = spawn('python', ['dialogue_management_model.py'])
module.exports = function(app) {

app.get('/', function(req, res) {
    res.render('index');
});

app.post('/', urlencodedParser, function(req, res) {
    var typed = (JSON.stringify(req.body).substring(2, JSON.stringify(req.body).indexOf(":") - 1));
    console.log(typed)
    module.exports.typed = typed
    var data = typed;
    dataString = '';
    // Handling the Input data from the Front End With the Post request.

    // taking computed/operated data from the python file
    py.stdout.on('data', function(data){
    dataString += data.toString();
    });

    // Simply logging it to the Console
    py.stdout.on('end', function(){
        console.log(dataString);
        res.send(dataString);
    }); 

    // python doesn't understand the data without string format
    py.stdin.write(data);
    py.stdin.end();

})

}

服务器是在其他文件中启动的,并将完全控制权传递到这里,从这里我正在调用python代码进行输入计算并把结果传递给我。

1 个答案:

答案 0 :(得分:2)

您将在第一次通话后完全结束输入流。将var py = spawn('python', ['dialogue_management_model.py'])移到后请求处理程序中,这样每个请求都将生成一个子进程,写入数据,结束输入流,等待响应,并在输出流结束时返回结果。

这为您提供了使其线程更安全的附加好处。也就是说,如果您同时有两个请求,则两个请求最终都会为py.stdout.on('data', ...添加侦听器,从而导致两个输出都混合在一起。另外,我非常确定py.stdout.on('end',只会触发一次,因此从第一个请求开始运行stdout.end回调之后出现的任何请求都将挂起,直到它们超时。


此外,与您的问题无关,但在您这样做时:

var typed = (JSON.stringify(req.body).substring(2, JSON.stringify(req.body).indexOf(":") - 1))

您应该将JSON.stringify()分配给变量,这样就不必运行两次。

即。 var payload = JSON.stringify(req.body); var typed = (payload.substring(2, payload.indexOf(":") - 1))

但是即使那样,如果您只需要第一个键,也可以执行Object.keys(req.body)[0]而不是将对象转换为字符串并解析该字符串。