当我将输入发送到用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代码进行输入计算并把结果传递给我。
答案 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]
而不是将对象转换为字符串并解析该字符串。