Как передать данные sh клиенту сразу после записи res.write (), перед res.end (), в Express. js? - PullRequest
0 голосов
/ 24 февраля 2020

Я создал клиент Apache Kafka, используя Kafka js, и я пытаюсь читать сообщения из топи c в Kafka. Это работает нормально, если я console.log (сообщение). Но я хочу отправлять сообщение клиенту каждый раз, когда новое сообщение создается / пишется в топи c, которую потребитель слушает от производителей, при этом сохраняя соединение живым.

 // function, which is being called whenever it's specified route is being requested
 async readMessage(req, res, next, consumer) {
    const resMessage = {};

    res.writeHead(200, {'Content-Type': 'text/plain'});

    await consumer.run({
        eachMessage: async ({ topic, partition, message }) => {  
            res.write(message.value.toString());
        },
    });

    // res.send(resMessage);
}

Но после Я отправляю данные на сервер express. js, а res.write () не отправляет данные клиенту (в качестве клиента Node.js я использую Postman). Как передать sh данные, записанные в res.write (), перед вызовом res.end ()?

1 Ответ

0 голосов
/ 25 февраля 2020

res.write() отправляет данные (без буферизации по Express или nodejs), как только вы их вызовите. Я проследил это в отладчике и увидел, что он отправляет данные без задержки. Он может кратко буферизироваться операционной системой, обслуживающей алгоритм Nagle, но это будет очень короткая задержка (миллисекунды). Итак, данные отправляются клиенту. Гораздо более вероятно, что ваша проблема в http-клиенте, который получает данные.

Большинство http-клиентов созданы для ожидания запроса / ответа. Отправьте запрос, дождитесь полного ответа, затем оповестите звонящего. Поэтому, если вы хотите получать регулярные данные из потока http по мере его поступления, вам понадобится нетрадиционный http-клиент, который будет уведомлять вас, когда данные поступают таким образом. Возможно, вам также понадобится изобрести некоторый протокол, который позволит клиенту знать, когда пришел полный кусок, поскольку пакеты могут быть разбиты на фрагменты или сгруппированы случайным образом.

Что может быть проще, чем использовать http для этого использовать реальный протокол на основе сообщений, такой как webSockets или socket.io, который явно разработан для того, что вы пытаетесь сделать. Клиент установит sh соединение с сервером, и тогда сервер сможет отправлять сообщения клиенту в любое время. webSocket или socket.io основаны на сообщениях, поэтому они уже выполняют всю работу за вас: разграничить сообщение, упаковать его, доставить, распаковать и уведомить получателя о прибытии сообщения. Это именно то, для чего был разработан webSocket / socket.io.

Для односторонней отправки сообщений (с сервера на клиент) вы также можете использовать Отправленные сервером события , которые являются расширением HTTP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...