nodejs前后端交互——后端

需求:

  1. 将前端页面获得的传参数给后端
  2. 后台有一个控制台中启动的程序,通过process将参数写入控制台
  3. 通过process得到控制台输出后将结果返回前端
var async = require('async');
var http1=require('http');
var http2=require('http');
var spawn = require('child_process').spawn;
var subProcess = spawn("bash");
var fs= require("fs");
var fs1= require("fs");
   
console.log("=============================================================");

subProcess.stdin.write('    ');      //Process写入命令启动控制台程序

var task1 =function(callback){
    var htmlget = '';
	http1.createServer(function (request, response) {
    request.on('data', function(data) { 
        htmlget = data;// 接收web发送过来的数据
    });
        subProcess.stdin.write('play black '+htmlget+' \n',function(){
        console.log('task1:play black '+htmlget);  //将命令写入程序
    })
	subProcess.stdin.write('genmove white '+'\n',function(){
        //console.log('genmove white ');
    })
        //console.log('subProcess.stdin.write '+htmlget);
	}).listen(8080,'127.0.0.1');
	callback(null,htmlget)
}

var task2 =function(callback){
    subProcess.stdout.on('data', function(data){//获取命令行输出
        var tempdata = data;
        var service_body;
        //console.log("task2-all: "+tempdata); 
        if (tempdata.toString().split(' ')[1] == 'output:'){//对命令行输出内容处理
            service_body = tempdata.toString().split(' ')[2];
            fs.writeFileSync('./js/message.txt',service_body);//写入本地文件
            //var filedata = fs.readFileSync('./js/message.txt', 'utf8');
            //console.log("task2:"+service_body);
            //console.log("filedata:"+filedata);
        }
	})   
    
}
async.waterfall([task1,task2],function(err,result){
		if (err) {
			console.log(err);
		}
		console.log('result:'+result);
	})

var server2 = http2.createServer(function (request, response) {
    request.on('data', function(data) { //将上一步中写入本地的内容传回客户端
	//console.log('body 8081:'+body);
    });
    request.on('end', function() {
        response.writeHeader(200, {
            'Content-Type': 'text/plain',
            'Access-Control-Allow-Origin': '*'    //解决跨域问题
        });
        var fsdata = fs1.readFileSync('./js/message.txt', 'utf8');
        //console.log('fsdata 8081:'+fsdata.toString());
        response.write(fsdata.toString());
        response.end();
        //fs1.writeFileSync('./js/message.txt',' ');
    })
}).listen(8081,'127.0.0.1');

 

问题总结:

  • 没必要使用async.waterfall,process的输出Process.stdout.on和Process.stderr.on是异步的,task2中并没有对task1的参数有依赖
  • 由于浏览器无法直接读本地文件,所以使用http将暂存的结果传到前端。如果数据复杂可以使用json格式
  • 前后端的动作需要交替执行,所以再前端中需要加入条件保证前后端交替传输数据
  • 尝试将process.stdout.on中的数据赋值全局变量,但是没有成功,如果可以那写入txt部分可以省略

你可能感兴趣的:(Nodejs)