var express = require(‘express’); var app = express(); app.listen(3000); var bodyParser = require(‘body-parser’) var hbs = require(‘hbs’); var spawn = require(‘child_process’).spawn;
app.set(‘view engine’, ‘html’); app.engine(‘html’, hbs.__express); app.use(express.static(‘public’)); app.use(bodyParser.urlencoded({ extended: false }));
ls = spawn(‘某程序’);
app.post(’/’, function(req, res) { var info = req.body;//请求前端得到表单的值 ls.stdin.write(“calculate(“+info.xxx+”)"+ “\n”);//子线程调用程序完成一些计算 ls.stdout.on(‘data’, function(data) { //做一些数据的处理 res.render(’…’,{data:…});//然后反馈呈现到前端页面上 }); }); 这样做的话提交一次表单运行正常,第二次就会报错说Can’t set headers after they are sent, 查了之后说是回调有问题,后来把res.render去掉,console一些需要的结果,发现第一次提交表单运算后输出一次,当第二次提交表单的时候输出两次,第三次提交输出三次。。。
下面是把ls.stdout.on拿到post外面,这样做的话提交一次表单运算后输出一次,不会出现上面重复的问题,但是这里就不能用res.render()去把结果呈现在前端上了,因为在post外面,做不了res的反馈。。。 app.post(’/’, function(req, res) { var info = req.body; ls.stdin.write("calculate(info.xxx+ “\n”);//子线程调用程序完成一些计算 }); ls.stdout.on(‘data’, function(data) { //处理计算得到后的数据。console.log一些需要的结果,方便在终端查看结果 });
请教懂的小伙伴们,怎么做能一举两得呐?我是小白一枚。。。
你重复监听了