Отправка нескольких ответов с одним и тем же объектом ответа в nodejs - PullRequest
0 голосов
/ 31 декабря 2018

У меня длительный процесс, который должен отправить данные обратно при множественном ответе.Есть ли какой-нибудь способ отправить несколько ответов с помощью express.js? Я хочу, чтобы через 3 секунды "test" получил новый "ответ" "bar"

app.get('/api', (req, res) => 
{
    res.write("test");
    setTimeout(function(){   
        res.write("bar"); 
        res.end();
    }, 3000);
});

с res.write a ожидание 3050 ответа

t

Ответы [ 2 ]

0 голосов
/ 31 декабря 2018

Да, вы можете сделать это.То, что вам нужно знать, это на самом деле кодировка передачи по частям .

Это одна из старых техник, которая использовалась десять лет назад, со времен Websockets, я не видел никого, кто бы использовал это.

Очевидно, что вам нужно отправлять ответы только в разное время, может быть, до некоторых событий будет запущено позже в чанках .На самом деле это тип ответа по умолчанию в express.js.

Но здесь есть одна загвоздка.Когда вы пытаетесь проверить это, предполагая, что вы используете современный браузер или curl, которые все они буферизуют, так что вы не увидите ожидаемого результата.Уловка заполняет буферы чанка перед отправкой последовательных чанков ответа.См. Пример ниже:

const express = require('express'),
app = express(),
port = 3011;

app.get('/', (req, res) => {

    // res.write("Hello\n"); 
    res.write("Hello" + " ".repeat(1024) + "\n"); 

    setTimeout(() => {
        res.write("World");
        res.end();
    }, 2000);

});

app.listen(port, () => console.log(`Listening on port ${port}!`));

Первый res.write с дополнительными 1024 пробелами заставляет браузер рендерить чанк.Тогда ваш второй res.write ведет себя так, как вы ожидали.Вы можете увидеть разницу с раскомментированием первого res.write.

На уровне сети разницы нет.На самом деле даже в браузере вы можете достичь этого с помощью XHR Object (первая реализация AJAX). Вот ответ

0 голосов
/ 31 декабря 2018

Ответ HTTP-запроса имеет однозначное сопоставление.Вы можете вернуть HTTP-ответ один раз, каким бы длинным он ни был.Существует 2 распространенных метода:

  1. Ответы кометы - Поскольку Response является записываемым потоком, вы можете время от времени записывать в него данные, прежде чем завершить его.Убедитесь, что тайм-аут чтения соединения правильно настроен на клиенте, который будет получать эти данные.

  2. Просто используйте веб-сокеты - это постоянное соединение, которое позволяет осуществлять двусторонний обмен сообщениями между сервером и клиентом.

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