❝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, утечки памяти — это память, которая должна быть утилизирован, другими словами, объект, который должен был быть помечен как достижимый, не был утилизирован нормально
❝Ах Кай 👦 Одноклассник: Так как же обнаружить утечку памяти?
❞
- Снимок памяти, вы можете использовать узел-HeaPDumpофициальная документацияПолучите снимки памяти для сравнения и найдите переполнения памяти
- Инструмент визуальной проверки утечки памяти Easy-Monitorофициальная документация
1.7 Как взаимодействуют две узловые программы?
❝Ответ таков: через fork принцип заключается в том, что дочерняя программа использует process.on для мониторинга сообщения родительской программы, использует process.send для отправки сообщений дочерней программе и использует child.on, child.send для взаимодействия в родительской программе для реализации родительского процесса и дочернего процесса.Процессы отправляют сообщения друг другу
❞
модуль дочернего_процесса
❝Предоставляет функцию порождения дочерних процессов, включая базовую реализацию кластера, упомянутого в предыдущих разделах, или child_process.
❞
Этот модуль в основном включает следующие функции асинхронного процесса.
- В вилке: это метод в приведенном выше Кодексе реализует, что родительский процесс и дочерний процесс отправляют сообщения друг другу. Через вилку канал IPC может быть открыт между родительским процессом и дочерним процессом, так что разные процессы узла могут общаться друг с другом.
- exec: создает оболочку и запускает команду в оболочке.По завершении stdout и stderr передаются функции обратного вызова.Первый параметр exec полностью аналогичен команде оболочки.Сцена используется для выполнения команд.Подробнее о сценарии приложения exec Вы можете увидеть, что дерево варенья писало ранее:Разработайте простые строительные леса от 0 до 1
- spawn
Продолжение следует...
🌲Предыдущие статьи Соуса:
- Вы изучили BFF и Serverless?
- Расскажите об инструментах ежедневной совместной работы для фронтенд-разработки
- данные формы внешнего интерфейса
- Как лучше управлять интерфейсом API
- Микро интерфейсные вещи
- передовой инжиниринг
- Внешний интерфейс Nginx
- Развертывание интерфейсной эксплуатации и обслуживания
Пожалуйста, выпейте 🍵
1. После прочтения не забудьте поставить лайк 🌲 соусу, там есть 👍 и мотивация
2. Обратите внимание на интересные вещи в интерфейсе официального аккаунта и пообщайтесь с вами об интересных вещах в интерфейсе.
3. Статья размещена на GithubfrontendThingsСпасибо, Стар✨