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!