У меня есть скрипт node.js, который содержит две вещи:

  1. Запустите http-сервер, который прослушивает POST-запрос из браузера.
  2. Запустите сокет подключения к серверу Java

Когда запрос приходит из браузера, я отправляю некоторые данные на java-сервер, используя сокет, а затем возвращаю данные с java-сервера в браузер в ответ http.

Он отлично работает для первого запроса, но во втором запросе я получу ошибку:

Error: Can't set headers after they are sent. 

Вот скрипт node.js:

 var client = new net.Socket(); var clientConnected = false; app.options('*', cors()); app.use(function(req, res, next) { var data = new Buffer(''); req.on('data', function(chunk) { // read buffer data from the browser in the POST request data = Buffer.concat([data, chunk]); }); req.on('end', function() { req.rawBody = data; next(); }); }); app.post('/xxxxxx', function(req, res) { res.header("Access-Control-Allow-Origin", "*"); if (!clientConnected) { // if the socket is not connected, create it client.connect(G_PORT, G_ADDRESS, function() { clientConnected = true; }); client.on('close', function() { clientConnected = false; }); client.on('data',function(data) { // get result from the java server through socket res.send(data); }); client.on('error', function(error){ clientConnected = false; }); res.send(); } else { // the socket is created, just send the data to socket client.write(req.rawBody); } }); 

Ошибка указана на строку:

 res.send(data); 

в

 client.on('data',function(data) 

Я новичок в выражении и надеюсь, что кто-то может дать мне несколько советов, спасибо :)

ОБНОВИТЬ:

Я пытался закрыть сокет каждый раз, когда я заканчиваю один запрос, и в этом случае все работает нормально:

 if (true) { var client = new net.Socket(); client.connect(G_PORT, G_ADDRESS, function() { client.write(data); }); client.on('close', function(){ }); client.on('data',function(data){ res.send(decodeData); client.destroy(); }); client.on('error', function(error){ }); } 

Кажется, проблема как-то связана с моим глобальным экземпляром сокета ???

Ошибка «Ошибка: невозможно установить заголовки после их отправки». приходите, когда вы вызываете res.send, когда один уже вызван.

На ваш почтовый запрос у вас есть 2 res.send

  client.on('data',function(data) { // get result from the java server through socket res.send(data); }); client.on('error', function(error){ clientConnected = false; }); res.send(); 

Когда клиент находится в «данных», вы отправляете также в res.send, и это делает ошибку. Вам нужно для каждого запроса только один res.send

Может быть, вы должны попробовать это.

 var client = new net.Socket(); var clientConnected = false; app.options('*', cors()); app.use(function(req, res, next) { var data = new Buffer(''); req.on('data', function(chunk) { // read buffer data from the browser in the POST request data = Buffer.concat([data, chunk]); }); req.on('end', function() { req.rawBody = data; next(); }); }); app.post('/xxxxxx', function(req, res) { res.header("Access-Control-Allow-Origin", "*"); if (!clientConnected) { // if the socket is not connected, create it var buffer = ''; client.connect(G_PORT, G_ADDRESS, function() { clientConnected = true; }); client.on('close', function() { clientConnected = false; }); client.on('data',function(data) { buffer  = data; }); client.on('error', function(error){ clientConnected = false; }); client.on('end', function() { res.send(buffer); }); } else { // the socket is created, just send the data to socket client.write(req.rawBody); res.send(req.rawBody); } });