JavaScript - один из самых популярных языков программирования в мире. Чтобы использовать его эффективно, мы должны знать его основы.

В этой статье мы рассмотрим основы Node.js, включая создание потоков.

Потоки

Доступные для записи потоки используются во многих местах в Node.

Эти потоки представляют собой объекты, имеющие метод write, которому можно передать строку или объект Buffer для записи чего-либо в поток.

Метод end закрывает поток и, при необходимости, принимает значение для записи в поток перед закрытием.

Мы можем создать доступный для записи поток, который указывает на файл с функцией createWriteStream из модуля fs.

Затем мы можем использовать метод write для записи файла по частям, а не все сразу, как в случае с writeFile.

Читаемые потоки могут читать данные из различных источников.

Данные читаются с помощью обработчиков событий.

У объектов, которые генерируют события в Node, есть on метод для прослушивания событий.

Читаемые потоки генерируют событие data и end.

data запускается каждый раз, когда поступают данные,

end вызывается всякий раз, когда поток находится в конце.

Он подходит для потоковой передачи данных, которые могут быть обработаны немедленно.

Например, мы можем изменить ответ, отправляемый нашим HTTP-сервером, следующим образом:

const { createServer } = require("http");
createServer((request, response) => {
  response.writeHead(200, { "Content-Type": "text/plain" });
  request.on("data", chunk =>
    response.write(chunk.toString().toLowerCase()));
  request.on("end", () => response.end());
}).listen(8000);

Затем, если мы сделаем запрос с текстовым телом, простой текст будет преобразован в нижний регистр.

Это потому, что у chunk есть части тела запроса, и мы пишем это, когда они передаются в поток чтения.

И поток чтения заканчивается выдачей события end, мы завершаем ответ.

Файловый сервер Node.js

Мы можем обслуживать файлы на нашем сервере, используя модуль fs и модуль url для анализа пути из запроса.

Например, мы можем написать:

const http = require('http');
const url = require('url');
const fs = require('fs');
http.createServer((req, res) => {
  const q = url.parse(req.url, true);
  const filename = `.${q.pathname}`;
  fs.readFile(filename, (err, data) => {
    if (err) {
      res.writeHead(404, {'Content-Type': 'text/html'});
      return res.end("404 Not Found");
    } 
    res.writeHead(200, {'Content-Type': 'text/html'});
    res.write(data);
    return res.end();
  });
}).listen(8080);

В приведенном выше коде мы получаем путь к файлу из имени файла.

В модуле url есть метод parse, который получает путь к файлу через свойство pathname.

Затем мы используем readFile для чтения файла с заданным относительным путем.

И в обратном вызове мы записываем файл, если он существует.

В случае ошибки мы возвращаем ответ 404.

Поэтому, когда мы сделаем запрос к http://localhost:8080/foo.txt, мы получим содержимое foo.txt, если оно хранится на сервере.

События

Мы можем генерировать и прослушивать события с помощью модуля events.

Например, мы можем написать:

const events = require('events');
const eventEmitter = new events.EventEmitter();

для создания нового EventEmitter объекта.

Затем мы можем использовать метод emit для генерации события:

eventEmitter.emit('hello');

И мы можем послушать это, написав:

eventEmitter.on('hello', () => {
  console.log('got hello');
});

Мы можем отправить данные на мероприятие. Например, мы можем написать:

eventEmitter.emit('hello', 'james');

Тогда 'james' - это наши данные.

Затем мы можем получить данные, написав:

eventEmitter.on('hello', (data) => {
  console.log(`hello ${data}`);
});

data содержит отправленные нами данные.

Заключение

Потоки - это данные, которые можно передавать, записывать или читать.

Читаемые потоки - это потоки, которые могут читать данные по частям.

Доступный для записи поток может записывать данные кусками.

Мы можем использовать модуль url, чтобы преобразовать URL во что-то, что мы можем использовать.

Конструктор EventEmitter может использоваться для создания эмиттеров событий и прослушивания событий.

JavaScript на простом английском языке

Понравилась эта статья? Если да, то получите больше похожего контента, подписавшись на наш канал YouTube!