Интервьюер спрашивает вас об узле (дополнительно)

внешний интерфейс

Frontier: Продолжая последний раз, когда интервьюер спрашивал вас об основах узла, отзыв о детской обуви сказал: «Почему он такой простой, он слишком водянистый». это не великий бог, это мразь, но с моей точки зрения, я надеюсь помочь всем учиться лучше, поэтому есть план для продвинутой главы Сегодня Шуцзяо продолжит говорить с вами о продолжении узла те вещи, прилагаетсяЧто интервьюер спрашивает вас об узле (нормально)

1. Сегодняшняя основная еда 🍞

1.1 В чем разница между app.get, app.use и app.all при регистрации маршрута?

В предыдущей главе основы упомянули, как использовать Express для создания простого сервера. После того, как основная структура должна быть определена маршрутизация интерфейса и промежуточное программное обеспечение. В настоящее время нам нужно определить app.get, app.get и промежуточное программное обеспечение в файле входа App.js. app.use и app.all и другие методы, а какая разница между этими тремя раньше? Мы иллюстрируем пример

когда мы просим/userПри роутинге будет выводиться последовательно树酱🌲来了а такжеHello World, а потом на стороне браузера показывает, что выполнение завершено, и такой же доступ/user/treeбудет выводить только树酱🌲来了,Зачем?

  • app.use(path,callback)

app.useэто метод, используемый экспрессом для вызова промежуточного программного обеспечения. ПО промежуточного слоя обычно не обрабатывает запросы и ответы, обычно только обрабатывает входные данные и передает их следующему обработчику в очереди, например, в следующем примере.app.use('/user'), то пока путь начинается с/userможет быть сопоставлен в начале, например/user/treeможет соответствовать

  • app.all()

app.all относится ко всем методам запроса в маршрутизации, используемым для обработки маршрутизации, соответствующим полному пути после app.use. Это можно понимать как включение определений app.get, app.post и т. д., таких какapp.all('/user/tree'), который может одновременно охватывать:get('/user/tree') 、 post('/user/tree')、 put('/user/tree'), но относительно соответствия префикса app.use() он соответствует определенному маршруту

Резюме: Резюме одного предложения: все полные совпадения, использовать только префиксы совпадений.

1.2 Каковы распространенные методы экспресс-ответа?

res.end()res.send()res.render()res.redirect()express Response

  • res.end()

Завершить ответ — если у сервера нет данных для клиента, вы можете использовать res.end для прямого возврата, чтобы завершить процесс ответа.

  • res.send(body)

Если на сервере есть данные, вы можете использовать res.send, вы можете игнорировать res.end, параметр body может быть объектом Buffer, объектом String или массивом.

  • res.render

res.render используется для рендеринга файлов шаблонов, а также может использоваться в сочетании с механизмами шаблонов.Давайте посмотрим на простую демонстрацию (механизм шаблонов Express+ejs)

Во-первых, это инструкция по настройке.

app.set('views', path.join(__dirname, 'views')); // views:模版文件存放的位置,默认是在项目根目录下
app.set('view engine', 'ejs'); // view engine:使用什么模版引擎

Во-вторых, написать шаблон в соответствии с синтаксисом используемого механизма шаблонов и, наконец, передатьres.render(view,locals, callback)Экспорт, конкретное использование параметров

view:模板的路径
locals:渲染模板时传进去的本地变量
callback:如果定义了回调函数,则当渲染工作完成时才被调用,返回渲染好的字符串(正确)或者错误信息 ❌

Для более подробного использования res.render в сочетании с механизмом шаблонов рекомендуется прочитать:Экспресс: глубокое погружение в механизм шаблонов

  • res.redirect

Переопределить URL-адрес, указанный путем, а также определить код состояния HTTP при перенаправлении (по умолчанию 302).

res.redirect('http://baidu.com');
res.redirect(301, 'http://baidu.com');

1.3 Как узел использует многоядерные процессоры и создает кластеры?

Как мы все знаем, nodejs построен на основе движка V8 браузера Chrome. Процесс nodejs может использовать только один ЦП (один ЦП запускает один экземпляр узла). Например: теперь у нас есть 8-ядерный сервер, поэтому, если мы не используйте многоядерные процессоры, это пустая трата ресурсов.В настоящее время вы можете использовать многоядерный процессор, запустив несколько процессов.

Node.js дает намclusterМодуль используется для многоядерной обработки nodejs, и его можно использовать для создания кластера службы узла для балансировки нагрузки.

По указанному вышеуказанному коду мы создаем многоправительную поддержку и услуги балансировки нагрузки, результаты следующие 👇

Чувак👦Одноклассник: Тогда почему несколько процессов могут слушать один и тот же порт?

В приведенной выше демонстрации 1 главный процесс и 8 рабочих процессов успешно открыты, потому что отслеживается только один порт 3000. Логически, если порт отслеживается несколькими процессами, будет сообщено о конфликте портов, но на этот раз он есть. это не ошибка, это странно? , давайте посмотрим на порт для деталей👇

Я пошел ~ оказывается, что порт 3000 контролируется не всеми процессами, а только процессом Master (pid равен '32101'), давайте посмотрим на связь между процессом Master и Worker

Мастер создается методом cluster.fork() и по существу использует метод child_process.fork().Чтобы узнать о взаимосвязи между кластером, дочерним_процессом, процессом и т. д., вы можете прочитать эту статью.Кластер Node.js наступает на сводку ямы

Ах Куан👦Студент: Есть ли какой-нибудь другой способ, кроме описанного выше, добиться многопроцессорности и балансировки нагрузки?

Это может быть достигнуто с помощью инструмента PM2.pm2 содержит всю вышеперечисленную логику обработки.Нам не нужно изменять исходный код, пока мы используем управление pm2 при перезапуске, запускаемpm2 start test.js -i 2

  • pm2 start test.js -i 2

Это означает, что режим кластерного режима запускает два экземпляра приложения app.js, и эти два приложения автоматически выполняют балансировку нагрузки.- iСледующее число представляет собой количество рабочих потоков, которые необходимо запустить. Если указанное число равно 0, PM2 будет создавать соответствующие рабочие потоки в зависимости от количества ядер вашего процессора.

Разработка: мы можем обрабатывать многостраничный сканер с помощью кластерного модуля, многопроцессорная архитектура Node может использовать ресурсы процессора, мы работаем с большим количеством времени, вы можете попробовать решить этот путь.

Для получения дополнительной информации об использовании pm2 вы можете увидеть, что ранее писал соус дерева:Развертывание интерфейсной эксплуатации и обслуживания

1.4 Как узел поддерживает https?

Реализация https неотделима от сертификата.Открытый ключ и закрытый ключ генерируются через openssl (подробно не описывается), а затем на основе реализации модуля https экспресса задаются параметры конфигурации.Есть два варианта в параметрах один - тело сертификата, а другой - пароль

1.5 узел и клиент как решить проблему кроссдоменности?

Ответ: Вы можете добавить настройки заголовка в настройках маршрутизации

Ah Le👧: Что это значит, когда вы используете здесь app.use('*')?

Добавление * после может привести к полному совпадению,app.all('*',(req,res,next)=>{})Эффект эквивалентенapp.use((req,res,next)=>{}), Это также относительно распространенное приложение app.all, которое используется для обработки междоменных запросов.

1.6 Что такое утечка памяти в приложении узла?

Утечка памяти — это ситуация, когда программе не удается освободить память, которая больше не используется, из-за ошибки. Если использование памяти по-прежнему будет слишком высоким, это повлияет на реакцию сервера.Если ситуация серьезная, программа сразу выйдет из строя.Как избежать этой ситуации, насколько это возможно, или как ее устранить?

Существует меньше, чем утечка памяти:

  • Глобальные переменные не уничтожаются вручную, потому что глобальные переменные не перерабатываются.
  • Закрытие: на переменные в замыкании ссылается глобальный объект, тогда локальные переменные в замыкании не могут быть освобождены.
  • После добавления события слушателя оно не удаляется, что вызовет утечку памяти

Это также включает сборку мусора (GC), nodejs — это движок V8, который выполняет javascript, то есть GC nodejs означает GC движка V8, и, исходя из принципа GC, утечки памяти — это память, которая должна быть утилизирован, другими словами, объект, который должен был быть помечен как достижимый, не был утилизирован нормально

Ах Кай 👦 Одноклассник: Так как же обнаружить утечку памяти?

1.7 Как взаимодействуют две узловые программы?

Ответ таков: через fork принцип заключается в том, что дочерняя программа использует process.on для мониторинга сообщения родительской программы, использует process.send для отправки сообщений дочерней программе и использует child.on, child.send для взаимодействия в родительской программе для реализации родительского процесса и дочернего процесса.Процессы отправляют сообщения друг другу

модуль дочернего_процесса

Предоставляет функцию порождения дочерних процессов, включая базовую реализацию кластера, упомянутого в предыдущих разделах, или child_process.

Этот модуль в основном включает следующие функции асинхронного процесса.

  • В вилке: это метод в приведенном выше Кодексе реализует, что родительский процесс и дочерний процесс отправляют сообщения друг другу. Через вилку канал IPC может быть открыт между родительским процессом и дочерним процессом, так что разные процессы узла могут общаться друг с другом.
  • exec: создает оболочку и запускает команду в оболочке.По завершении stdout и stderr передаются функции обратного вызова.Первый параметр exec полностью аналогичен команде оболочки.Сцена используется для выполнения команд.Подробнее о сценарии приложения exec Вы можете увидеть, что дерево варенья писало ранее:Разработайте простые строительные леса от 0 до 1
  • spawn

Продолжение следует...

🌲Предыдущие статьи Соуса:

Пожалуйста, выпейте 🍵

1. После прочтения не забудьте поставить лайк 🌲 соусу, там есть 👍 и мотивация

2. Обратите внимание на интересные вещи в интерфейсе официального аккаунта и пообщайтесь с вами об интересных вещах в интерфейсе.

3. Статья размещена на GithubfrontendThingsСпасибо, Стар✨