node.js
основан на движке Chrome
v8
для запуска кода js
, поэтому мы можем избавиться от среды браузера и запускать код js
непосредственно в консоли, например, следующий hello world
код hello world
console.log('hello world');
вы можете запустить его напрямую, используя node
в консоли.
Встроенный модуль http
в node.js
предоставляет базовые возможности службы http
. На основании спецификации CommonJS
мы можем использовать require
для импорта модуля http
. В http
есть функция createServer
модуль, который позволяет нам создать http
. Сервер получает функцию обратного вызова в качестве параметра. Эта функция обратного вызова получает два параметра — request
и response
.
request
включает в себя всю информацию, запрошенную клиентом, такую как url
, header
запроса, метод запроса и. Тело запроса.response
в основном используется для возврата информации. Клиент инкапсулирует некоторые операции, связанные с телом ответа. Например, метод response.writeHead
позволяет нам настраивать информацию заголовка и код состояния возвращаемого тела. тело ответа, мы вызываем метод response.end()
. Вы можете отправить тело ответа клиенту. Использование функции createServer
только создает для нас объект Server
, но не позволяет ему прослушивать. Метод listen
объекта server
для прослушивания Фактически мы можем запустить
listen
в качестве сервера. Первый параметр — это номер порта прослушивания, второй параметр — это привязанный ip
хоста, а третий параметр — это функция обратного вызова, которая будет. вызывается асинхронно модулем http
. При возникновении ошибки это может быть Выброшенное исключение получается из первого параметра функции обратного вызова. Мы можем выбрать обработку исключения, чтобы сделать наш сервер более надежным.Ниже приведен пример. использование модуля http
для создания простого сервера.
const { createServer } = require('http'); const HOST = 'локальный хост'; константный ПОРТ = '8080'; const server = createServer((req, resp) => { // первый параметр — это код состояния, который он возвращает // и второй параметр — информация заголовка ответа resp.writeHead(200, { 'Content-Type': 'text/plain' }); console.log('сервер работает...'); // вызываем метод завершения, чтобы сообщить серверу, что запрос выполнен resp.end('привет HTTP-сервер nodejs'); }); server.listen(PORT, HOST, (ошибка) => { если (ошибка) { console.log('Что-то не так: ', ошибка); возвращаться; } console.log(`сервер прослушивает http://${HOST}:${PORT} ...`); });
Вы можете попробовать запустить его с помощью node
и создать собственный сервер! После запуска сервера браузер может получить доступ к серверу, открыв http://localhost:8080.
Вы также можете использовать nodemon
для его запуска, чтобы при изменении нашего кода нам не нужно было вручную завершать программу и повторно запускать
npm i -g nodemon.
Рекомендуется установить его глобально, чтобы вы могли использовать его напрямую. без использования npx nodemon
Это также очень просто, просто замените команду node
на команду nodemon
http-server.js.
. Когда мы ранее использовали объекты createServer
и resp
, мы не видели никаких синтаксических подсказок. Мы должны следовать официальной документации node
, чтобы проверить ее в любое время. Это немного неудобно, но это не имеет значения. можно использовать .d.ts
помогает нам предоставить функцию синтаксической подсказки. Обратите внимание, что мы не используем ts
для разработки, а используем только его функцию синтаксической подсказки
npm init -y
@types/node
-- pnpm i @types/node -D
jsconfig.json
в каталоге проекта, исключите node_modules
, проверять его нет необходимости{ "compilerOptions": { «checkJs»: правда }, "исключить": ["node_modules", "**/node_modules/*"] }
Интересно, обнаружили ли вы, что в приведенном выше коде действительно есть ошибка? checkJs
может помочь нам проверить наличие ошибок типа. Вы можете выбрать, включать ли его в соответствии с вашими потребностями. После включения проверки он сразу же сообщит нам о несоответствии типа параметра.
В это время наведите указатель мыши на метод listen
, и вы увидите сигнатуру метода.
Как видите, исходный параметр port
должен иметь тип number
, но когда мы его определили, он имел тип string
, поэтому он не совпадал. Просто измените его на number
8080
, и вы сможете напрямую просмотреть соответствующую документацию api
. не открывая официальный node
. Мне потребовалось много времени, чтобы найти документ и проверить его.
. Наш простой http server
вернул только одно предложение. Можно ли вернуть несколько предложений? Для этого необходимо использовать метод write
объекта resp
. end
может возвращать содержимое только один раз. Вместо этого мы можем записывать содержимое в тело write
несколько раз. В конце концов, нам нужно вызвать end
только один раз. передать любые параметры. Только дайте ему выполнить функцию отправки тела ответа
const { createServer } = require("http"); const HOST = «локальный хост»; константный ПОРТ = 8080; const server = createServer((req, resp) => { resp.writeHead(200, { "Content-Type": "text/plain" }); console.log("сервер работает..."); // пишем несколько лоремных предложений resp.write("Lorem ipsum dolor sit amet consectetur adipisicing elit.n"); resp.write("Omnis eligendi aperiam delectus?n"); resp.write("Aut, quam quo!n"); соответственно.конец(); }); server.listen(PORT, HOST, (ошибка) => { если (ошибка) { console.log("Что-то не так: ", ошибка); возвращаться; } console.log(`сервер прослушивает http://${HOST}:${PORT} ...`); });
На этот раз мы написали три предложения, и эффект стал таким:
мы можем не только вернуть строку в браузер, но и напрямую прочитать содержимое html
файла и в результате вернуть его в браузер. Для этого необходимо использовать еще один встроенный модуль Node.js
— fs
, который предоставляет функцию работы с файлами. Вы можете использовать fs.readFile
для асинхронного чтения файлов, но он не вернет объект- promise
, поэтому нам нужно передать обратный вызов для обработки операции после чтения файла. также можно использовать fs.readFileSync
Синхронно блокируя чтение файлов, здесь мы выбираем асинхронное чтение
const { createServer } = require("http"); const fs = require("fs"); const HOST = «локальный хост»; const PORT = 8080;const server = createServer((req, resp) => { // меняем тип MIME с text/plain на text/html resp.writeHead(200, { "Content-Type": "text/html" }); // читаем содержимое html-файла fs.readFile("index.html", (ошибка, данные) => { если (ошибка) { консоль.ошибка( "произошла ошибка при чтении содержимого html-файла: ", ошибаться бросить ошибку; } console.log("Операция успешна!"); соответственно.write(данные); соответственно.конец(); }); }); server.listen(PORT, HOST, (ошибка) => { если (ошибка) { console.log("Что-то не так: ", ошибка); возвращаться; } console.log(`сервер прослушивает http://${HOST}:${PORT} ...`); });
Текущий результат следующий:
Успешно вернуть html
Примечание. Здесь вам нужно изменить **Content-Type**
заголовка ответа на **text/html**
чтобы сообщить браузеру, что мы возвращаем содержимое файла **html**
. Если вы все еще используете ** Если возвращается **text/plain**
, браузер не будет анализировать возвращаемый контент, даже если он соответствует синтаксису **html**
, он не будет анализироваться, как показано ниже:
Когда нам нужно написать внутренний сервер, который отвечает только за возврат данных интерфейса, нам нужно возвращать контент в формате json
. Я думаю, вы умны и знаете, как с этим справиться:
MIME
на application/json
resp.write
передается строка json
. Вы можете использовать JSON.stringify
для обработки объекта и возвратаconst { createServer } = require("http"); const HOST = «локальный хост»; константный ПОРТ = 8080; const server = createServer((req, resp) => { // меняем тип MIME на application/json resp.writeHead(200, { "Content-Type": "application/json" }); // создаем данные json с помощью объекта const jsonDataObj = { код: 0, сообщение: «успех», данные: { название: "пластилин", возраст: 20, хобби: "кодирование", }, }; resp.write(JSON.stringify(jsonDataObj)); соответственно.конец(); }); server.listen(PORT, HOST, (ошибка) => { если (ошибка) { console.log("Что-то не так: ", ошибка); возвращаться; } console.log(`сервер прослушивает http://${HOST}:${PORT} ...`); });
Результаты следующие:
Идея возврата pdf-файлов аналогична предыдущей идее возврата html
файлов. Они представляют собой процесс установки MIME
типа заголовка ответа, чтения файла и возврата содержимого файла. Но на этот раз мы это делаем. Наша идея состоит в том, чтобы сделать это во время работы сервера. Чтобы сгенерировать pdf
файл и вернуть его, вам нужно изменить тип MIME
на application/pdf
Чтобы создать pdf
файл, вам нужно использовать библиотеку — pdfkit
pnpm и pdfkit.
Сначала мы пишем функцию для создания файла pdf
, поскольку создание файла pdf
также требует выполнения некоторых операций записи, не знаю, когда они будут завершены, но наш запрос должен дождаться создания файла pdf
, прежде чем мы сможем это сделать. получить ответ, поэтому нам нужно сделать его асинхронным и вернуть promise
/** * @description Создать файл PDF */const createPdf = () => { вернуть новое обещание((разрешить, отклонить) => { if (!fs.existsSync("example.pdf")) { // создаем объект PDFDocument const doc = новый PDFDocument(); // создаем поток записи, передавая содержимое PDF-файла. doc.pipe(fs.createWriteStream("example.pdf")); //добавляем содержимое в PDF-документ doc.fontSize(16).text("Привет, PDF", 100, 100); // завершаем операцию создания PDF-файла. документ.конец(); } решить("успех"); }); };
Операция конвейера используется здесь для передачи содержимого объекта PDFDocument
во вновь созданный поток записи через конвейер. Когда операция завершается, мы уведомляем внешний мир через resovle
о том, что pdf
файл создан, а затем вызываем
const. server в коде сервера = createServer(async (req, resp) => { // меняем тип MIME на application/pdf resp.writeHead(200, { "Content-Type": "application/pdf" }); // создаем PDF-файл ожидайте создания PDF(); // читаем созданный PDF-файл fs.readFile("example.pdf", (ошибка, данные) => { если (ошибка) { консоль.ошибка( "произошла ошибка при чтении содержимого PDF-файла: ", ошибаться ); выбросить ошибку; } console.log("Операция успешна!"); соответственно.end(данные); }); }); server.listen(PORT, HOST, (ошибка) => { если (ошибка) { console.log("Что-то не так: ", ошибка); возвращаться; } console.log(`сервер прослушивает http://${HOST}:${PORT} ...`); });
Теперь браузер может прочитать созданный pdf
файл.
осталась прежней. Прочитайте аудиофайл, затем отправьте его в resp
объект через конвейер и верните
const { createServer } = require("http"); const {stat, createReadStream} = require("fs"); const HOST = «локальный хост»; константный ПОРТ = 8080; const server = createServer((req, resp) => { // меняем тип MIME на audio/mpe resp.writeHead(200, { "Content-Type": "audio/mp3" }); const mp3FileName = "audio.mp3"; stat(mp3FileName, (ошибка, статистика) => { если (stats.isFile()) { const rs = createReadStream(mp3FileName); // передаем поток чтения соответствующему rs.pipe(соответственно); } еще { resp.end("MP3-файл не существует"); } }); }); server.listen(PORT, HOST, (ошибка) => { если (ошибка) { console.log("Что-то не так: ", ошибка); возвращаться; } console.log(`сервер прослушивает http://${HOST}:${PORT} ...`); });
Эффект следующий.
После открытия появляется интерфейс воспроизведения аудио. Это отображение аудиофайлов, предоставляемых chrome
. Открыв консоль, вы обнаружите, что там возвращены аудиофайлы.
Примечание. После передачи потока аудиофайла в **resp**
через канал нет необходимости вызывать метод **resp.end()**
, поскольку это закроет весь ответ и приведет к тому, что аудиофайл будет недоступен.
Обработка видеофайлов и аудиофайлов аналогична, за исключением того, что тип MIME
необходимо изменить на video/mp4
. Все остальное то же самое
const { createServer } = require("http"); const {stat, createReadStream} = require("fs"); const HOST = «локальный хост»; константный ПОРТ = 8080; const server = createServer((req, resp) => { // меняем тип MIME на audio/mpe resp.writeHead(200, { "Content-Type": "audio/mp4" }); const mp4FileName = "video.mp4"; stat(mp4FileName, (ошибка, статистика) => { если (stats.isFile()) { const rs = createReadStream(mp4FileName); // передаем поток чтения соответствующему rs.pipe(соответственно); } еще { resp.end("Файл mp4 не существует"); } }); }); server.listen(PORT, HOST, (ошибка) => { если (ошибка) { console.log("Что-то не так: ", ошибка); возвращаться; } console.log(`сервер прослушивает http://${HOST}:${PORT} ...`); });
мы узнали:
Node
для создания http
сервераjs
html
pdf
JSON
Хотя содержание простое, я все же надеюсь, что вы сможете следовать и попробовать. Это не значит, что вы это знаете. Вы обнаружите свои собственные проблемы только после того, как действительно реализуете это.