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

  • Разделить поток на более мелкие куски
  • Объединение нескольких потоков в один
  • Фильтрация или преобразование данных потока
  • Направляйте потоки в разные места назначения
  • Обработка ошибок потока и конечных событий

Вы можете установить поток событий с помощью npm:

npm install event-stream

Или с помощью пряжи:

yarn add event-stream

Что такое выборка?

Fetch — это современный API JavaScript, который позволяет вам делать сетевые запросы и получать ответы в виде читаемого потока. Это замена объекта XMLHttpRequest (XHR), который является традиционным способом выполнения запросов AJAX. fetch имеет несколько преимуществ перед XHR, например:

  • Он использует обещания для обработки асинхронных операций.
  • Он поддерживает потоковую передачу ответов и запросов.
  • Он имеет более простой и понятный синтаксис.
  • По умолчанию он следует той же политике происхождения.

Вы можете использовать выборку для выполнения GET, POST, PUT, DELETE и других HTTP-запросов. Например, вы можете использовать выборку, чтобы получить файл JSON с сервера:

fetch('/data.json')
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error(error));

Как создать поток событий, используя поток событий и выборку?

Чтобы создать поток событий с помощью event-stream и fetch, нам нужно выполнить следующие шаги:

  • Создайте серверный скрипт, который отправляет события, используя тип MIME text/event-stream. Каждое событие представляет собой блок текста, заканчивающийся парой символов новой строки. Событие может иметь имя, полезные данные и необязательный идентификатор. Например:
// server.js
const http = require('http');
const es = require('event-stream');
// Create a HTTP server
const server = http.createServer((req, res) => {
    // Check if the request path is /stream
    if (req.url === '/stream') {
        // Set the response headers
        res.writeHead(200, {
            'Content-Type': 'text/event-stream',
            'Cache-Control': 'no-cache',
            'Connection': 'keep-alive'
        });
        // Create a counter variable
        let counter = 0;
        // Create an interval function that sends an event every second
        const interval = setInterval(() => {
            // Increment the counter
            counter++;
            // Create an event object with name, data, and id properties
            const event = {
                name: 'message',
                data: `Hello, this is message number ${counter}`,
                id: counter
            };
            // Convert the event object to a string
            const eventString = `event: ${event.name}\ndata: ${event.data}\nid: ${event.id}\n\n`;
            // Write the event string to the response stream
            res.write(eventString);
            // End the response stream after 10 events
            if (counter === 10) {
                clearInterval(interval);
                res.end();
            }
        }, 1000);
    } else {
        // Handle other requests
        res.writeHead(404);
        res.end('Not found');
    }
});
// Listen on port 3000
server.listen(3000, () => {
    console.log('Server listening on port 3000');
});
  • Создайте клиентский сценарий, который использует выборку для получения потока событий с сервера. Затем используйте свойство body ответа, чтобы получить читаемый поток. Затем используйте метод getReader() потока, чтобы получить объект чтения. Затем используйте метод read() средства чтения, чтобы прочитать каждый фрагмент данных из потока. Каждый фрагмент представляет собой объект со свойствами value и done. Значение представляет собой Uint8Array, содержащий байты фрагмента. done — это логическое значение, указывающее, завершен ли поток или нет. Например:
// client.js
// Fetch the event stream from the server
fetch('/stream')
    .then(response => {
        // Get the readable stream from the response body
        const stream = response.body;
        // Get the reader from the stream
        const reader = stream.getReader();
        // Define a function to read each chunk
        const readChunk = () => {
            // Read a chunk from the reader
            reader.read()
                .then(({
                    value,
                    done
                }) => {
                    // Check if the stream is done
                    if (done) {
                        // Log a message
                        console.log('Stream finished');
                        // Return from the function
                        return;
                    }
                    // Convert the chunk value to a string
                    const chunkString = new TextDecoder().decode(value);
                    // Log the chunk string
                    console.log(chunkString);
                    // Read the next chunk
                    readChunk();
                })
                .catch(error => {
                    // Log the error
                    console.error(error);
                });
        };
        // Start reading the first chunk
        readChunk();
    })
    .catch(error => {
        // Log the error
        console.error(error);
    });
  • Запустите серверный и клиентский сценарии и наблюдайте за результатами. В консоли браузера вы должны увидеть что-то вроде этого:
event: message
data: Hello, this is message number 1
id: 1
event: message
data: Hello, this is message number 2
id: 2
event: message
data: Hello, this is message number 3
id: 3
event: message
data: Hello, this is message number 4
id: 4
event: message
data: Hello, this is message number 5
id: 5
event: message
data: Hello, this is message number 6
id: 6
event: message
data: Hello, this is message number 7
id: 7
event: message
data: Hello, this is message number 8
id: 8
event: message
data: Hello, this is message number 9
id: 9
event: message
data: Hello, this is message number 10
id: 10
Stream finished

Заключение

В этом сообщении блога мы узнали, как использовать event-stream и fetch для создания потока событий, который может отправлять и получать фрагменты данных по сети. Мы увидели, как использовать event-stream для создания потоков и управления ими на стороне сервера, а также как использовать fetch для использования потоков на стороне клиента. Мы также узнали, как использовать читаемые потоки, программы чтения и фрагменты для обработки потоковых данных в JavaScript.

Надеюсь, вы нашли этот пост полезным и информативным. Если у вас есть какие-либо вопросы или отзывы, пожалуйста, оставьте комментарий ниже. Спасибо за чтение!