С трудом пытаться понять «next / next ()» в express.js

Это пример:

// Configuration app.configure(function(){ app.set('views', __dirname + '/views'); app.set('view engine', 'jade'); app.use(express.bodyParser()); app.use(express.methodOverride()); app.use(app.router); app.use(express.static(__dirname + '/public')); }); 

(и т.д.)

 app.get('/memo', function(req, res) { console.log("index"); Memo.find({}, function(err, data) { if(err) return next(err); res.render('index', { memos: data }); }); }); 

И вот еще один:

 app.get('/memo/list', function(req, res, next) { console.log("get memos"); Memo.find({}, function(err, data) { if(err) return next(err); res.json(data); }); }); 

Взято из простой записной книжки, построенной на узле

Это вопросы, которые меня озадачивают:

  1. Что именно в next/next(); делать? Что произойдет, если его нет?
  2. Почему вторая часть принимает next параметр, а первый – нет?

РЕДАКТИРОВАТЬ:

Express использует функции промежуточного программного обеспечения, которые имеют обратные вызовы (функции, которые вызываются при завершении действия), а затем имеет эту цель (это обратный вызов, который запускает следующее промежуточное программное обеспечение в стек Express). Все промежуточное ПО Express (совместимое с Connect) имеют 3 параметра: запрос, ответ, следующий (что необязательно).

Например, статическое middlware обслуживает статические файлы, промежуточное ПО csrf проверяет наличие параметра при получении запросов POST и промежуточного программного обеспечения маршрутизатора, которое обрабатывает маршруты (то, что вы вставили выше, является частью этого).

Каждое промежуточное ПО может выполнить свою задачу и вызвать next промежуточное ПО в очереди, если выполняются некоторые условия (например, статическое промежуточное ПО не будет вызывать следующее промежуточное ПО, поскольку оно будет заботиться о себе, чтобы обслуживать файлы, чтобы маршрутизатор выиграл вызываем).

В маршрутизаторе вы обычно не называете next потому что оно имеет тенденцию быть последним промежуточным программным обеспечением (если вы не хотите что-то вроде бенчмаркинга).

Если вы хотите создать промежуточное программное обеспечение, которое запрещает доступ ко всем пользователям, которые не вошли в систему, вам нужно будет вызвать next() только если пользователь зарегистрирован (чтобы вызывалось следующее промежуточное программное обеспечение, маршрутизатор в этом случае и пользователь может получить доступ к странице, которую они ищут), иначе вы, вероятно, перенаправите их на страницу входа.

next принимает либо никаких параметров вообще, либо ошибку в качестве параметра.

Изменить: на основе вашей конфигурации маршрутизатор находится перед статическим промежуточным программным обеспечением, поэтому, если вы хотите, чтобы файлы были поданы, вам нужно объявить маршрут подстановки, который вызывает next (), когда маршрут не сопоставляется:

 app.get('*', function (req, res, next) { // no route is matched // so call next() to pass to the static middleware next(); }); 

Примечание. Я не рекомендую ставить статический файловый сервер после маршрутизатора, я предлагаю вам поставить его раньше, чтобы вы могли определить свои собственные 404 маршрута.

  • Node.js - превышен максимальный размер стека вызовов
  • Как я могу указать нужную версию Node.js в packages.json?
  • Как вы следуете за HTTP-переадресацией в Node.js?
  • Порядок приоритетности маршрутизатора в express.js
  • nodejs, как читать нажатия клавиш от stdin
  • как освободить localhost от Error: прослушать EADDRINUSE
  • Что означает промежуточное ПО и app.use в Expressjs?
  • После установки Gulp: «no command» gulp «found»
  • Надежность транспорта Websocket (потеря данных Socket.io при повторном подключении)
  • префикс глобального пути npm
  • Как установить cookie в узле js с помощью express-frameworks?
  • Interesting Posts

    Как определить, когда минимизируется форма windows?

    Файлы в SMB-Share заблокированы, и некоторые приложения не могут их трогать

    Почему удаленный рабочий стол (RDP) недостаточно быстрый для просмотра видео на удаленном ПК?

    Как повторить символ с использованием printf?

    Я хочу изменить DPI с помощью ImageMagick без изменения фактического размера байтов данных изображения

    Заполнение combobox из базы данных с помощью hibernate в Java

    Ubuntu не будет распознавать загрузочный USB или CD

    Анимация для expandableListView

    Android KitKat securityException при попытке чтения из MediaStore

    Как изменить обои Windows 7 Starter Edition?

    Google Chrome: есть разные настройки на разных компьютерах?

    Самый быстрый способ перебрать все символы в строке

    Как отключить локальную пересылку портов SSH?

    Как я могу перенаправить запросы на свой собственный IP-адрес на локальный IP-адрес в моей сети (возможно, с помощью named)?

    Как добавить изображение в EditText

    Давайте будем гением компьютера.