javascript node.js next ()


149

Я вижу много пользы nextв node.js.

Что это, откуда оно? Что оно делает? Могу ли я использовать его на стороне клиента?

Извините, это используется, например, здесь: http://dailyjs.com/2010/12/06/node-tutorial-5/

ищите функцию loadUser.


Я нигде этого не видел, и нигде в документации это не упоминается. Вы уверены, что он не определен где-то в кодовой базе, на которую вы смотрите?
Самир Талвар

Это слишком расплывчато. Можете ли вы привести пример контекста.
Raynos

Ответы:


115

Похоже, это соглашение об именовании переменных в коде потока управления Node.js, где ссылка на следующую выполняемую функцию дается обратному вызову, который запускается по завершении.

Смотрите, например, примеры кода здесь:

Давайте посмотрим на пример, который вы разместили:

function loadUser(req, res, next) {
  if (req.session.user_id) {
    User.findById(req.session.user_id, function(user) {
      if (user) {
        req.currentUser = user;
        return next();
      } else {
        res.redirect('/sessions/new');
      }
    });
  } else {
    res.redirect('/sessions/new');
  }
}

app.get('/documents.:format?', loadUser, function(req, res) {
  // ...
});

loadUserФункция ожидает функции в ее третий аргумент, который связан с именем next. Это нормальный параметр функции. Он содержит ссылку на следующее действие, которое нужно выполнить, и вызывается после loadUserего завершения (если пользователь не может быть найден).

В nextэтом примере нет ничего особенного в названии ; мы могли бы назвать это как угодно.


Это также довольно часто используется в express.js, но это не так .next(). Кажется, он спрашивает о nextметоде объекта.
Raynos

1
Лучше использоватьreturn next();
Райан Уолтон

2
@RyanWalton Я согласен
Уэйн

Я использовал return callback()вместоreturn next()
Виджай

39

Это соглашение об именах, используемое при передаче обратных вызовов в ситуациях, которые требуют последовательного выполнения действий, например, сканирование каталога -> чтение данных файла -> что-то делать с данными. Это предпочтение глубокого вложения обратных вызовов. Первые три раздела следующей статьи в блоге Тима Касвелла HowToNode дают хороший обзор этого:

http://howtonode.org/control-flow

Также см. Раздел « Последовательные действия » второй части этой публикации:

http://howtonode.org/control-flow-part-ii


1
Большое спасибо за эти ссылки. Это многое объясняет, когда вы начинаете работать с nodejs
Абделилла

Ссылка не работает сейчас. Это дает внутреннюю ошибку сервера
Deep Kakkar

1
Обновлены ссылки из интернет-архива
Pero P.

спасибо за ссылки, я начал использовать Node несколько месяцев назад, но я обнаружил, что использую эти практики, но не до конца понимаю их
Чарльз Смит

8

Это в основном похоже на обратный вызов, который используется в express.js после выполнения и выполнения определенной части кода, вы можете использовать его, чтобы убедиться, что часть кода выполнена и что вы хотите сделать дальше, но всегда помнить, что вы можете только сделать один res.sendв каждом блоке REST ...

Таким образом, вы можете сделать что-то вроде этого в качестве простого next()примера:

app.get("/", (req, res, next) => {
  console.log("req:", req, "res:", res);
  res.send(["data": "whatever"]);
  next();
},(req, res) =>
  console.log("it's all done!");
);

Это также очень полезно, когда вы хотите иметь промежуточное программное обеспечение в своем приложении ...

Чтобы загрузить функцию промежуточного программного обеспечения, вызовите app.use (), указав функцию промежуточного программного обеспечения. Например, следующий код загружает функцию промежуточного программного обеспечения myLogger перед маршрутом к корневому пути (/).

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

var myLogger = function (req, res, next) {
  console.log('LOGGED');
  next();
}

app.use(myLogger);

app.get('/', function (req, res) {
  res.send('Hello World!');
})

app.listen(3000);
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.