javascript node.js next ()

148

Widzę wiele zastosowań nextw node.js.

Co to jest, skąd się bierze? Co to robi? Czy mogę go używać po stronie klienta?

Przepraszamy, jest używany na przykład tutaj: http://dailyjs.com/2010/12/06/node-tutorial-5/

poszukaj funkcji loadUser.

Złupić
źródło
Nigdzie tego nie widziałem i nie ma o tym żadnego odniesienia w dokumentacji. Czy na pewno nie jest zdefiniowany gdzieś w oglądanej bazie kodu?
Samir Talwar
To zbyt niejasne. Czy możesz podać przykład kontekstu.
Raynos

Odpowiedzi:

114

Wydaje się, że jest to konwencja nazewnictwa zmiennych w kodzie przepływu sterowania Node.js, w której odwołanie do następnej funkcji do wykonania jest przekazywane do wywołania zwrotnego, aby mógł on zacząć działać po zakończeniu.

Zobacz na przykład przykłady kodu tutaj:

Spójrzmy na przykład, który opublikowałeś:

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) {
  // ...
});

loadUserFunkcja oczekuje funkcję w swoim trzecim argumencie, który jest związany z nazwą next. To jest normalny parametr funkcji. Zawiera odniesienie do następnej akcji do wykonania i jest wywoływana po jej loadUserwykonaniu (chyba że nie można znaleźć użytkownika).

W nexttym przykładzie nie ma nic specjalnego w nazwie ; moglibyśmy to nazwać cokolwiek.

Wayne
źródło
Jest to również często używane w express.js, ale tak nie jest .next(). Wydaje się, że pyta o nextmetodę na obiekcie.
Raynos,
1
Lepsze w użyciureturn next();
Ryan Walton
2
@RyanWalton Zgadzam się
Wayne
Użyłem return callback()zamiastreturn next()
vijay
39

Jest to konwencja nazewnictwa stosowana przy przekazywaniu wywołań zwrotnych w sytuacjach wymagających seryjnego wykonania akcji, np. Skanowanie katalogu -> odczyt danych pliku -> zrobienie czegoś z danymi. Jest to preferowane do głębokiego zagnieżdżania wywołań zwrotnych. Pierwsze trzy części następującego artykułu na blogu Tima Caswella HowToNode dają dobry przegląd tego:

http://howtonode.org/control-flow

Zobacz także sekcję Działania sekwencyjne w drugiej części tego ogłoszenia:

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

Pero P.
źródło
1
Wielkie dzięki za te linki. To wyjaśnia wiele rzeczy, kiedy zaczynasz pracę z nodejs
Hassam Abdelillah
Link nie działa teraz. Daje wewnętrzny błąd serwera
Deep Kakkar
1
Zaktualizowane linki z archiwum internetowego
Pero P.
dziękuję za linki, zacząłem używać Node kilka miesięcy temu, ale używam tych praktyk, ale nie do końca je rozumiem
Charles Smith
8

Jest to w zasadzie jak wywołanie zwrotne, którego używa express.js po wykonaniu i zakończeniu określonej części kodu.Możesz go użyć, aby upewnić się, że część kodu została wykonana i co chcesz zrobić dalej, ale zawsze pamiętaj, że możesz zrób po jednym res.sendw każdym bloku REST ...

Możesz więc zrobić coś takiego jako prosty next()przykład:

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

Jest to również bardzo przydatne, gdy chcesz mieć oprogramowanie pośredniczące w swojej aplikacji ...

Aby załadować funkcję oprogramowania pośredniego, wywołaj app.use (), określając funkcję oprogramowania pośredniego. Na przykład poniższy kod ładuje funkcję oprogramowania pośredniego myLogger przed trasą do ścieżki głównej (/).

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);
Alireza
źródło