Node.js Node js-如何处理多个异步任务

Node.js Node js-如何处理多个异步任务,node.js,asynchronous,task,Node.js,Asynchronous,Task,我是node的新手,一直在处理多个异步任务 除了node之外,我还有另一个服务器(S1),它不会立即向请求返回数据,它可以返回多种类型的数据,也可以发送通知,而无需专门请求,因此node必须侦听来自它的数据,解析数据并相应地采取行动 与此服务器(S1)的连接通过以下方式完成: S1 = net.createConnection({'host':S1Host, 'port': S1Port}); 节点通过以下方式侦听数据: S1.on('data', function(data){ S1Da

我是node的新手,一直在处理多个异步任务

除了node之外,我还有另一个服务器(S1),它不会立即向请求返回数据,它可以返回多种类型的数据,也可以发送通知,而无需专门请求,因此node必须侦听来自它的数据,解析数据并相应地采取行动

与此服务器(S1)的连接通过以下方式完成:

S1 = net.createConnection({'host':S1Host, 'port': S1Port});
节点通过以下方式侦听数据:

S1.on('data', function(data){
  S1DataParse(data);
});
我必须将正确的数据(解析后)路由到特定的POST请求

app.post('/GetFooFromS1', function(req, res){

  // Send request to S1
  S1.write({'type':'foo'});

  // If got the correct data sometime in the future, send response to the browser
  res.setHeader('Content-Type', 'application/json');
  res.json({'status':'success', 'value':S1FooData});
});
我尝试使用异步模块来实现这一点,但没有成功。 我想做的是:

var asyncTasks = [];

app.post('/GetFooFromS1', function(req, res){

  asyncTasks.push(function(callback){
    // Send request to S1
    S1.write({'type':'foo'});
  });

  async.parallel(asyncTasks, function(response){
    res.setHeader('Content-Type', 'application/json');
    res.json({'status':'success', 'value':response});
  });
});
以及S1DataParse中的另一个任务:

function S1DataParse(){
  if(data.type='foo'){
    asyncTasks.push(function(callback){
      callback(data);
    });
  }
}
但是,当然,第二个任务从未添加到asyncTasks数组中。我真的受不了了。 你能帮我吗

谢谢

-=-=-=-编辑-=-=-=-

最后,我遇到了事件事件发射器()

在POST请求中,我调用向数据服务器发送请求的函数(DataServerClientGet)。 在这个函数中,我注册了一个监听器,它将获得未来的数据。 eventEmitter.on('getData',returnDataServerData)

除了一件事,一切都很好。每当我刷新页面或添加其他POST请求时,我都会收到一个错误:

错误:发送邮件后无法设置邮件头。

如果我能解决这个问题就太好了。请帮帮我

谢谢;)

整个代码如下所示:

var express = require('express');
var app = express();
var http = require('http').Server(app);
var bodyParser = require('body-parser')
var net = require('net');
var events = require('events');

var dataServerHost = '127.0.0.1';
var dataServerPort = 12345;
var dataServerClient;
var logMsg;

var eventEmitter = new events.EventEmitter();


/*******************************************/
//                Init
/*******************************************/
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: true}));
app.use(express.static(__dirname + '/public'));


/*******************************************/
//       Connect to the data server
/*******************************************/
DataServerConnect();


/*******************************************/
// Open listener on port 3000 (to browser)
/*******************************************/
http.listen(3000, function(){
  logMsg = 'listening on *:3000';
  console.log(logMsg);
});


/*******************************************/
//                Routing
/*******************************************/
app.get('/', function(req, res){
  res.sendFile(__dirname + '/index.html');
});

app.post('/GetDataFoo', function(req, res){
  var msg;
  var size;

  msg ='\n{"Type":"Query", "SubType":"GetDataFoo","SearchFilter":""}';
  size = msg.length;

  logMsg = 'Client to DataServer: GetDataFoo';
  console.log(logMsg);

  DataServerClientGet('GetDataFoo', size, msg, res);
});


/*******************************************/
//               Functions
/*******************************************/
function DataServerConnect(){
  dataServerClient = net.createConnection({'host':dataServerHost, 'port': dataServerPort}, function(){
    logMsg = 'Connected to DataServer ['+dataServerHost+':'+dataServerPort+']';
    console.log(logMsg);
  });

  dataServerClient.on('data', function(data){

    logMsg = 'DataServerData>>>\n'+data.toString()+'DataServerData<<<';
    console.log(logMsg);

    DataServerDataParse(data.toString());
  });

  dataServerClient.on('end', function(){
    logMsg = 'Disconnected from DataServer';
    console.log(logMsg);
  });
}

function DataServerClientGet(type, size, msg, res){
  dataServerClient.write('Type: Json\nSize: '+size+'\n\n'+msg, function(err){

  var returnDataServerData = function returnDataServerData(results){
    res.setHeader('Content-Type', 'application/json');
    res.json({'status':'success', 'value':results});
  }
  eventEmitter.on('getData', returnDataServerData);
}

function DataServerDataParse(json){
  if(json.Type=='GetDataFoo')
  {
    var MessageList = json.MessageList;
    eventEmitter.emit('getData', MessageList);
  }
}
var express=require('express');
var-app=express();
var http=require('http')。服务器(应用程序);
var bodyParser=require('body-parser')
var net=要求的(‘净额’);
var事件=要求(“事件”);
var dataServerHost='127.0.0.1';
var-dataServerPort=12345;
var数据服务器客户端;
var-logMsg;
var eventEmitter=new events.eventEmitter();
/*******************************************/
//初始化
/*******************************************/
use(bodyParser.json());
use(bodyParser.urlencoded({extended:true}));
app.use(express.static(uu dirname+/public));
/*******************************************/
//连接到数据服务器
/*******************************************/
DataServerConnect();
/*******************************************/
//打开端口3000上的侦听器(到浏览器)
/*******************************************/
http.listen(3000,函数(){
logMsg='监听*:3000';
console.log(logMsg);
});
/*******************************************/
//路由
/*******************************************/
app.get('/',函数(req,res){
res.sendFile(uu dirname+'/index.html');
});
app.post('/GetDataFoo',函数(req,res){
var-msg;
变量大小;
msg='\n{“类型”:“查询”,“子类型”:“GetDataFoo”,“SearchFilter”:“}”;
大小=msg.length;
logMsg='Client to DataServer:GetDataFoo';
console.log(logMsg);
DataServerClientGet('GetDataFoo',size,msg,res);
});
/*******************************************/
//功能
/*******************************************/
函数DataServerConnect(){
dataServerClient=net.createConnection({'host':dataServerHost,'port':dataServerPort},函数(){
logMsg='连接到数据服务器['+dataServerHost+':'+dataServerPort+'];
console.log(logMsg);
});
dataServerClient.on('data',函数(data){

logMsg='DataServerData>>>\n'+data.toString()+'DataServerData有一个可选的回调参数,可以传递给write function(),类似于:

S1.write({'type':'foo'},function(err){
  if(err){
   //Handle error
  }else{
     res.setHeader('Content-Type', 'application/json');
     res.json({'status':'success', 'value':response});
  }
})

这可以用于post路由,但在“数据”侦听器中,当没有客户端初始化的连接时,您无法将数据从服务器发送到客户端(它不是双向的)。如果您想要双向的行为,您可以检查

有一个可选的回调参数,您可以传递给write function(),类似于:

S1.write({'type':'foo'},function(err){
  if(err){
   //Handle error
  }else{
     res.setHeader('Content-Type', 'application/json');
     res.json({'status':'success', 'value':response});
  }
})

这可以用于post路由,但在“数据”侦听器中,当客户端未初始化连接时,您无法将数据从服务器发送到客户端(这不是双向的)如果您想要双随机行为,您可以检查

您好,非常感谢,写入中的回调非常有用。但是我必须处理返回到S1.on('data')的数据。正如我提到的,它是异步的,我必须将结果附加到正确的POST请求。此外,我还必须在代码后面的某个地方获取对res的引用,而不是POST请求本身。正如我所说,我认为这是不可能的,因为在http返回响应之后,没有连接处于活动状态。请检查我发布的上一次编辑的文本和代码。我我设法让POST请求等待,直到发射器从另一台服务器获取相关数据,然后才返回res。唯一需要处理的是错误:错误:发送后无法设置头。我还感觉通过代码传递res的方式不正确。可能错误与此错误的句柄有关您好,非常感谢,write中的回调非常有用。但是我仍然需要处理返回到S1.on('data')的数据。正如我提到的,它是异步的,我必须将结果附加到正确的POST请求。此外,我还必须在代码后面的某个地方获取对res的引用,而不是POST请求本身。正如我所说,我认为这是不可能的,因为在http返回响应之后,没有连接处于活动状态。请检查我发布的上一次编辑的文本和代码。我我设法让POST请求等待,直到发射器从另一台服务器获取相关数据,然后才返回res。唯一需要处理的是错误:错误:发送后无法设置头。我还感觉通过代码传递res的方式不正确。可能错误与此错误的句柄有关惯性导航与制导。