С трудом пытаться понять «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 }); }); });
И вот еще один:
- SyntaxError: использование const в строгом режиме?
- Почему Node.js однопоточный?
- Как я могу запросить различные значения в Mongoose?
- Импорт узлов-модhive с помощью TypeScript
- обнаружена утечка памяти EventEmitter
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
параметр, а первый – нет?
РЕДАКТИРОВАТЬ:
- Node.js - получить необработанное тело запроса с помощью Express
- Mongoose findByIdAndUpdate не возвращает правильную модель
- Равномерность набора тестов chai не работает должным образом
- Узел MongoDB проверяет, действительно ли objectid
- Каков предложенный способ установки brew, node.js, io.js, nvm, npm в OS X?
- Могут ли mongo обновить данные массива?
- поле мангуста с типом имени
- Node.js getaddrinfo ENOTFOUND
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 маршрута.