javascript node.js next ()


148

Ich sehe viel Verwendung nextin node.js.

Was ist es, woher kommt es? Was tut es? Kann ich es clientseitig verwenden?

Entschuldigung, es wird zum Beispiel hier verwendet: http://dailyjs.com/2010/12/06/node-tutorial-5/

Suchen Sie nach der Funktion loadUser.


Ich habe das nirgendwo gesehen und es wird nirgendwo in der Dokumentation darauf verwiesen. Sind Sie sicher, dass es nicht irgendwo in der Codebasis definiert ist, die Sie sich ansehen?
Samir Talwar

Das ist viel zu vage. Können Sie ein Beispiel für den Kontext geben?
Raynos

Antworten:


114

Dies scheint eine Namenskonvention für Variablen im Steuerflusscode von Node.j zu sein, bei der ein Rückruf auf die nächste auszuführende Funktion gegeben wird, damit sie nach Abschluss gestartet werden kann.

Siehe zum Beispiel die Codebeispiele hier:

Schauen wir uns das Beispiel an, das Sie gepostet haben:

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

Die loadUserFunktion erwartet in ihrem dritten Argument eine Funktion, die an den Namen gebunden ist next. Dies ist ein normaler Funktionsparameter. Es enthält einen Verweis auf die nächste auszuführende Aktion und wird aufgerufen, sobald loadUserdies ausgeführt wurde (es sei denn, ein Benutzer konnte nicht gefunden werden).

Der Name nextin diesem Beispiel hat nichts Besonderes . wir hätten es alles nennen können.


Dies wird auch in express.js häufig verwendet, ist es aber nicht .next(). Er scheint nach nexteiner Methode für ein Objekt zu fragen .
Raynos

1
Besser zu bedienenreturn next();
Ryan Walton

2
@ RyanWalton Ich stimme zu
Wayne

Ich habe return callback()anstelle vonreturn next()
Vijay

38

Diese Namenskonvention wird verwendet, wenn Rückrufe in Situationen übergeben werden, in denen Aktionen seriell ausgeführt werden müssen, z. B. Verzeichnis scannen -> Dateidaten lesen -> etwas mit Daten tun. Dies ist der tiefen Verschachtelung der Rückrufe vorzuziehen. Die ersten drei Abschnitte des folgenden Artikels im HowToNode- Blog von Tim Caswell geben einen guten Überblick darüber:

http://howtonode.org/control-flow

Siehe auch den Abschnitt Sequentielle Aktionen im zweiten Teil dieses Beitrags:

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


1
Vielen Dank für diese Links. Es erklärt eine Menge Dinge, wenn Sie anfangen, mit nodejs zu arbeiten
Hassam Abdelillah

Link funktioniert jetzt nicht. Es gibt internen Server-Fehler
Deep Kakkar

1
Aktualisierte Links aus dem Internetarchiv
Pero P.

Vielen Dank für die Links. Ich habe vor ein paar Monaten angefangen, Node zu verwenden, aber ich benutze diese Praktiken, verstehe sie aber nicht vollständig
Charles Smith,

7

Es ist im Grunde wie ein Rückruf, den express.js verwendet, nachdem ein bestimmter Teil des Codes ausgeführt und ausgeführt wurde. Sie können damit sicherstellen, dass ein Teil des Codes ausgeführt wird und was Sie als Nächstes tun möchten, aber denken Sie immer daran, dass dies nur möglich ist Mach eins res.sendin jedem REST- Block ...

Sie können also als einfaches next()Beispiel so etwas tun :

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

Es ist auch sehr nützlich, wenn Sie eine Middleware in Ihrer App haben möchten ...

Rufen Sie zum Laden der Middleware-Funktion app.use () auf und geben Sie die Middleware-Funktion an. Der folgende Code lädt beispielsweise die myLogger-Middleware-Funktion vor der Route zum Stammpfad (/).

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);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.