С трудом пытаться понять "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);
  });
});

Взято из простая записная книжка, построенная на node

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

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

EDIT:

Ответ 1

Экспресс использует функции промежуточного программного обеспечения, которые имеют обратные вызовы (функции, вызываемые при завершении действия), и следующая имеет эту цель (это обратный вызов, который запускает следующее промежуточное программное обеспечение в стек 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 маршрута.