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

(etc.)

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 как параметр и первый не так ли?

EDIT:

1 63

1 ответ:

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

например, статическое промежуточное программное обеспечение обслуживает статические файлы, промежуточное программное обеспечение 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 маршрута.