С трудом пытаясь понять '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);
});
});
взято с простой блокнот построен на узле
вот вопросы, которые меня озадачивают:
- что именно
next/next();
делать? Что произойдет, если его нет? - почему вторая часть берет
next
как параметр и первый не так ли?
EDIT:
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 маршрута.