Node.js:依次处理2个对HTTP服务器的请求



POST到http服务器时,服务器必须:

  1. 发送TCP消息到外部代理
  2. 从外部代理接收TCP应答
  3. 发送响应到客户端

但是我的客户端几乎在同一时间发送2个post。如何确保两个POST请求一个接一个被处理?

function sendReq (body, res)
{
var byteArr=[];
len = body.length;
//get pure data without {,}
data = body.substr (1,len-2);
//convert to array
arr = data.split (',');
for (let i = 0; i < arr.length; i++)
{
num = parseInt (arr[i]);
var numArr = num2arr (num);
byteArr = byteArr.concat (numArr);
}
res.writeHead (200,{
'Content-Type':'text/plain',
'Access-Control-Allow-Origin':'*'});

if (arr[1]==28)
{
var body = Buffer.alloc (392);
res.write (body);
}
if (arr[1]==11)
{
var body = Buffer.alloc (28);
res.write (body);
}
res.end ();
}

var http=require ('http');
http.createServer (function(req,res) {

data='';
req.on ('data', chunk => {
console.log (`Data chunk: ${chunk}`);
data += chunk;
sendReq (data,res);
});

}).listen (8000);

谢谢你,Zvika

下面的代码可以运行:

const Net = require('net');
var http=require ('http');
var events=require ('events');
var eventEmitter = new events.EventEmitter();
var reqQueue =[];
var resQueue =[];
// Create a new TCP client.
const client = new Net.Socket();
/************************************************************************/
/* This callback will be fired upon TCP message sent from server
/************************************************************************/
client.on('data',function(chunk){

//console.log (chunk);

//pull response object from queue
var res = resQueue.shift ();
//add response header
res.writeHead (200,{
'Content-Type':'text/plain',
'Access-Control-Allow-Origin':'*'});
//write response body
res.write (chunk);
res.end ();
});
/************************************************************************/
/* Convert number (e.g 0xCAFE2DAD to 4 bytes)
/************************************************************************/
function num2arr(n)
{
// Mask off 8 bytes at a time then shift them into place
return [
(n & 0xFF) >>>  0,
(n & 0xFF00) >>>  8,
(n & 0xFF0000) >>> 16,
(n & 0xFF000000) >>> 24,
];
}
/************************************************************************/
/* Connect to TCP server 
/************************************************************************/
function tcpConnect ()
{
// Send a connection request to the server.
client.connect({
host:'localhost',
port:5100
});
client.on('connect',function(){
console.log('Client: connection established with server');

});
}
/************************************************************************/
/* Convert HTTP request to TCP raw data request
/************************************************************************/
function sendReq (body)
{
let byteArr=[];
let len = body.length;
//get pure data without {,}
let data = body.substr (1,len-2);
//console.log (data);
//convert to array
let arr = data.split (',');
for (let i = 0; i < arr.length; i++)
{
let num = parseInt (arr[i]);
let numArr = num2arr (num);
byteArr = byteArr.concat (numArr);
}
client.write (Buffer.from(byteArr));
}
/************************************************************************/
/* Event callback fired upon HTTP request 
/************************************************************************/
var eventHandler = function (){
//console.log ('event fired');
//console.log (resQueue.length);
//pull request from queue
var chunk = reqQueue.shift();

sendReq (chunk);
}
/************************************************************************/
eventEmitter.on ('httpReq', eventHandler);
tcpConnect ();
/************************************************************************/
/*  Launch HTTP server            
/************************************************************************/
http.createServer (function(req,res) {

let data='';
req.on ('data', chunk => {
//console.log (`Data chunk: ${chunk}`);
data += chunk;
//push response to queue
resQueue.push (res);
//push request to queue
reqQueue.push (data);
//fire event 
eventEmitter.emit ('httpReq');
});
}).listen (8000);

如果外部TCP服务器关闭,此代码将崩溃。在这种情况下,HTTP服务器应该尝试永远重新连接。这条路对吗?

Evert -非常感谢!Zvika

最新更新