Załóżmy, że masz prosty blok kodu taki jak ten:
app.get('/', function(req, res){
res.send('Hello World');
});
Ta funkcja ma dwa parametry req
ires
, które przedstawiają żądania i odpowiedzi odpowiednio.
Z drugiej strony istnieją inne funkcje z trzecim parametrem o nazwie next
. Na przykład spójrzmy na następujący kod:
app.get('/users/:id?', function(req, res, next){ // Why do we need next?
var id = req.params.id;
if (id) {
// do something
} else {
next(); // What is this doing?
}
});
Nie rozumiem, o co next()
chodzi i dlaczego jest używany. W tym przykładzie, jeśli identyfikator nie istnieje, co next
właściwie robi?
res.send
do wykonania żądania. Jeśli nie istnieje, prawdopodobnie istnieje inny moduł obsługi, który wygeneruje błąd i wtedy wypełni żądanie.app.post('/login',function(req,res))
poapp.get('/users',function(req,res))
nim zadzwoni logowanie jest kolejna trasa w app.js pliku przez wywołanie next ()?app.get("/users")
, zostanie ona uruchomiona, jeśli program obsługi powyżej wywoła następnie.Odpowiedzi:
Przekazuje kontrolę nad następną pasującą trasą. W podanym przykładzie możesz na przykład wyszukać użytkownika w bazie danych
id
i przypisać go doreq.user
.Poniżej możesz wyznaczyć trasę taką jak:
Ponieważ / users / 123 najpierw dopasuje trasę w twoim przykładzie, najpierw sprawdzi i znajdzie użytkownika
123
; wtedy/users
może coś z tym zrobić.Oprogramowanie pośredniczące trasy jest jednak, moim zdaniem, bardziej elastycznym i wydajnym narzędziem, ponieważ nie zależy od konkretnego schematu URI ani kolejności tras. Byłbym skłonny do modelowania pokazanego przykładu tak, zakładając
Users
model z asynchroniąfindOne()
:Możliwość kontrolowania przepływu w ten sposób jest bardzo przydatna. Możesz chcieć, aby niektóre strony były dostępne tylko dla użytkowników z flagą administratora:
Mam nadzieję, że to dało ci inspirację!
źródło
next()
ponownie. Byłoby tak samo, gdybym tylko użyłnext(new Error(…)); return;
.next(new Error(…)); return;
. Jeśli przekażemy wartośćnext
, jest to jednostronnie uważane za błąd . Nie za bardzo zagłębiałem się w kod ekspresowy, ale przekopaj się, a znajdziesz to, czego potrzebujesz :)return next(…);
na,next(…); return;
więc jest mniej mylące.)Miałem też problem ze zrozumieniem next (), ale to pomogło
źródło
.get
jest wywoływany, a nie drugi?Zanim zrozumiesz
next
, musisz mieć pojęcie o cyklu Zapytanie-Odpowiedź w węźle, ale nie za bardzo szczegółowo. Zaczyna się od zgłoszenia żądania HTTP dla określonego zasobu i kończy się, gdy odeślesz odpowiedź do użytkownika, tj. Gdy napotkasz coś takiego jak res.send („Hello World”);spójrzmy na bardzo prosty przykład.
Tutaj nie potrzebujemy next (), ponieważ resp.send zakończy cykl i przekaże sterowanie z powrotem do oprogramowania pośredniego trasy.
Teraz spójrzmy na inny przykład.
Tutaj mamy 2 funkcje oprogramowania pośredniego dla tej samej ścieżki. Ale zawsze dostaniesz odpowiedź od pierwszego. Ponieważ jest to montowane najpierw na stosie oprogramowania pośredniego, a res.send zakończy cykl.
Ale co, jeśli zawsze nie chcemy „Hello World !!!!” odpowiedź z powrotem. W niektórych warunkach możemy chcieć „Hello Planet !!!!” odpowiedź. Zmodyfikujmy powyższy kod i zobaczmy, co się stanie.
Co
next
tu robisz? I tak, możesz mieć fałdy. Pominie pierwszą funkcję oprogramowania pośredniego, jeśli warunek jest spełniony, i wywoła następną funkcję oprogramowania pośredniego, a otrzymasz"Hello Planet !!!!"
odpowiedź.Następnie przekaż formant do następnej funkcji na stosie oprogramowania pośredniego.
Co się stanie, jeśli pierwsza funkcja oprogramowania pośredniego nie odeśle żadnej odpowiedzi, ale wykona logikę, a następnie otrzymasz odpowiedź z drugiej funkcji oprogramowania pośredniego.
Coś jak poniżej: -
W takim przypadku musisz wywołać obie funkcje oprogramowania pośredniego. Tak więc jedynym sposobem na przejście do drugiej funkcji oprogramowania pośredniego jest wywołanie next ();
źródło
next()
działa jakgoto
z przewodową wytwórnią? Oznacza to, że w swoim trzecim fragmencie, kiedy zadzwonisznext()
,res.send("Hello World !!!!");
nigdy nie zostanie stracony? Zauważyłem, że @Ashe zawsze miała wywołaniareturn;
po,next
które miały kod w tym samym drzewie wykonania ... Chyba zawsze mógłbym po prostu sprawdzić ekspresowo, co? / biegnie do swojego edytora tekstu;)next()
wywołaniu jest wywoływany . W tym przypadkupast the next() call
jest zapisywany na konsoli, a następnie pojawia sięError: Can't set headers after they are sent.
błąd, ponieważ drugires.send
jest wywoływany, choć bezskutecznie. Przepływ kodu powraca ponext()
wywołaniu, co sprawia, że @ Ashereturns
(lub inne zarządzanie logiką) jest ważne.next()
aby pominąć wykonanie pozostałych instrukcji. dzięki za zwrócenie na to uwagi.Dalej służy do przekazania kontroli do następnej funkcji oprogramowania pośredniego. Jeśli nie, prośba pozostanie zawieszona lub otwarta.
źródło
Wywołanie tej funkcji wywołuje następną funkcję oprogramowania pośredniego w aplikacji. Funkcja next () nie jest częścią Node.js ani Express API, ale jest trzecim argumentem przekazywanym do funkcji oprogramowania pośredniego. Funkcja next () może mieć dowolną nazwę, ale zgodnie z konwencją zawsze nosi nazwę „next”.
źródło
Wykonywanie
next
funkcji powiadamia serwer o zakończeniu tego kroku oprogramowania pośredniego i może wykonać następny krok w łańcuchu.źródło