Подтвердить что ты не робот

Экспресс следующая функция, для чего это действительно нужно?

Были попытки найти хорошее описание того, что делает метод next(). В документации Express сказано, что next('route') можно использовать для перехода на этот маршрут и пропускать все маршруты между ними, но иногда next вызывается без аргументов. Кто-нибудь знает хороший учебник и т.д., Который описывает функцию next?

4b9b3361

Ответ 1

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

Это полезно, скажем, если вы хотите иметь какой-то менеджер страниц с URL-адресами, а также множество других вещей, но вот пример.

app.get('/:pageslug', function(req, res, next){
  var page = db.findPage(req.params.pageslug);
  if (page) {
    res.send(page.body);
  } else {
    next();
  }
});

app.get('/other_routes', function() {
  //...
});

Этот код должен проверять базу данных для страницы с определенным идентификатором. Если он найдет, сделайте это! если он не находит его, то игнорируйте этот обработчик маршрута и проверяйте наличие других.

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


Или счетчик с меткой app.all('*'). Это позволяет вам выполнить какой-то общий установочный код, а затем перейти к другим маршрутам, чтобы сделать что-то более конкретное.

app.all('*', function(req, res, next){
  myHitCounter.count += 1;
  next();
});

app.get('/other_routes', function() {
  //...
});

Ответ 2

В большинстве фреймворков вы получаете запрос и хотите вернуть ответ. Из-за асинхронного характера Node.js у вас возникают проблемы с вложенными обратными вызовами, если вы делаете нетривиальные вещи. Чтобы это не происходило, Connect.js(до версии 4.0, Express.js был слоем поверх connect.js) имеет нечто, что называется промежуточным программным обеспечением, которое является функцией с 2, 3 или 4 параметрами.

function (<err>, req, res, next) {}

Ваше приложение Express.js представляет собой стек этих функций.

enter image description here

Маршрутизатор является особым, это промежуточное программное обеспечение, которое позволяет выполнять одно или несколько промежуточных программ для определенного URL-адреса. Итак, это стек внутри стека.

Так что же делать дальше? Просто, он сообщает вашему приложению, чтобы запустить следующее промежуточное программное обеспечение. Но что происходит, когда вы передаете что-то дальше? Express прервет текущий стек и запустит все промежуточное ПО, имеющее 4 параметра.

function (err, req, res, next) {}

Это промежуточное программное обеспечение используется для обработки любых ошибок. Мне нравится делать следующее:

next({ type: 'database', error: 'datacenter blew up' });

С этой ошибкой я, вероятно, скажу пользователю, что что-то пошло не так и зарегистрирует реальную ошибку.

function (err, req, res, next) {
   if (err.type === 'database') {
     res.send('Something went wrong user');
     console.log(err.error);
   }
};

Если вы представляете приложение Express.js в виде стека, вы, вероятно, сможете исправить много странности. Например, когда вы добавляете свое промежуточное ПО Cookie после маршрутизатора, имеет смысл, что ваши маршруты не будут иметь куки.

Ответ 3

ИМХО, принятый ответ на этот вопрос не очень точен. Другие ответили правильно, но я хотел предоставить немного больше кода, чтобы сделать его более конкретным. Скажем, у вас есть это простое экспресс-приложение:

var express = require('express');
var app = express();

app.get('/user/:id', function (req, res, next) {
    console.log('before request handler');
    next();
});

app.get('/user/:id', function (req, res, next) {
    console.log('handling request');
    res.sendStatus(200);
    next();
});

app.get('/user/:id', function (req, res, next) {
    console.log('after request handler');
    next();
});

app.listen(3000, function () {
    console.log('Example app listening on port 3000!')
});

Если вы делаете

curl http://localhost:3000/user/123

вы увидите, что это напечатано на консоли:

before request handler
handling request
after request handler

Теперь, если вы прокомментируете вызов next() в среднем обработчике следующим образом:

app.get('/user/:id', function (req, res, next) {
    console.log('handling request');
    res.sendStatus(200);
    //next();
});

Вы увидите это на консоли:

before request handler
handling request

Обратите внимание, что последний обработчик (тот, который печатает after request handler) не запускается. Это потому, что вы больше не говорите экспресс, чтобы запустить следующий обработчик.

Таким образом, на самом деле не имеет значения, был ли ваш "главный" обработчик (тот, который возвращает 200) был успешным или нет, если вы хотите, чтобы остальные остальные участники запускали, вы должны вызвать next().

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

Ответ 4

next() без параметра вызывает следующий обработчик маршрута в рамках.