Nodejs ждут сокета и затем отвечают на запрос http - PullRequest
0 голосов
/ 04 июня 2018

У меня есть код NodeJS, где, в основном, вот что происходит:

HTTP-запрос (app.get) -> Отправить запрос на сокет низкого уровня (с помощью net.Socket ()) -> Getответ от сокета -> res.send (ответ от сокета)

Это не работает, потому что net.Socket () использует асинхронные функции и события (client.on("data", callback)).

Я пыталсячто-то вроде этого:

app.get("/", function(req, res){
   client.connect("localhost", 420, function(){
      client.write("example data");
   });
   client.on("data", function(data){
       client.destroy();
       res.send(data);
});
});

Но это не работает, потому что говорит, что я пересылаю заголовки (объект res не изменится, так как функция является событием, а не функцией синхронизации).

Есть идеи?Или библиотека для синхронизации запросов сокетов?Я пробовал следующее:

  • Synket
  • sync-socket
  • netlinkwrapper

И они не работают.


Редактировать: я пытаюсь что-то вроде этого:

async function sendData(client, res){
  client.on('data', function(data){
    console.log("Got data!");
    res.send(""+data);
    res.end();
    console.log("Sent data!");
    client.destroy();
    console.log("Killed connection");
    return;
  });
}

app.get("/", function(req, res){
   var body = req.query;

client.connect(420, "localhost", function(){
      client.write("some random data");
      console.log("Connected & Data sent!");
      sendData(client, res);
   });
});

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

_http_outgoing.js:489
    throw new Error('Can\'t set headers after they are sent.');
    ^

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

1 Ответ

0 голосов
/ 04 июня 2018

client запускает data событие несколько раз.

`app.get("/", function(req, res){
   client.connect("localhost", 420, function(){
      client.write("example data");
   });
   client.pipe(res);
});
});
`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...