Co oznacza return request.on('end',()=>{}) ???

0

Uczę się Node.js i próbuje rozwikłać pewną rzecz.
Czym różni się:

return req.on('end',()=>{
   return res.end();
});

od :

req.on('end',()=>{
   return res.end();
});

Tzn. rozumiem, że to pierwsze to jest zwrócenie, a to drugie to jest wywołanie. Jednak czym w takim razie różni się sam fakt zwrócenia żądania od jego wywołania. No bo wywołanie to rozumiem, że po prostu wysyłam żądanie do serwera, tak? W takim razie jakie zadanie wykonuje zwrócenie żądania?

2

Można to zaprezentować, wydzielając zmienną.

result = req.on('end',()=>{
   return res.end();
});

Teraz Twoje dwa kody to:

result = req.on('end',()=>{
   return res.end();
});
return result; // zwrocenie

oraz

result = req.on('end',()=>{
   return res.end();
});
// return result; // nie zwrócenie
0

Ale

result = req.on('end',()=>{
   return res.end();
});
result;

Zwróci ponownie :P

Jednak czym w takim razie różni się sam fakt zwrócenia żądania od jego wywołania

Wywołanie masz w obu przypadkich. W pierwszym masz jawnie zwrócenie wyniku. W drugim masz niejawne zwrócenie wyniku jeśli jest to ostatnia linia w "bloku"

Czyli:

{
  wywołanie1();
  wywołanie2();
  wywołanie3();
}

jest równoznaczne

{
  wywołanie1();
  wywołanie2();
  return wywołanie3();
}
</del>
1
KamilAdam napisał(a):

Wywołanie masz w obu przypadkich. W pierwszym masz jawnie zwrócenie wyniku. W drugim masz niejawne zwrócenie wyniku jeśli jest to ostatnia linia w "bloku"

Czyli:

{
  wywołanie1();
  wywołanie2();
  wywołanie3();
}

jest równoznaczne

{
  wywołanie1();
  wywołanie2();
  return wywołanie3();
}

Czy aby na pewno?

function a () {
    c();
}

function b () {
    return c();
}

function c () {
    return "str";
}

console.log(a());
console.log(b());

Wynik:

undefined
str
0

Czy aby na pewno?

function a () {
    c();
}

function b () {
    return c();
}

function c () {
    return "str";
}

console.log(a());
console.log(b());

Wynik:

undefined
str

Czyli można by po prostu wyciągnąć wniosek, że jeśli nie chcę otrzymać "undefined" gdy wywołuję funkcję w innej funkcji (która zwraca jakąś wartość), to przy wywołaniu też muszę dać returna.
Mylę się?

0

Oj, wybaczcie;-) Powinienem od razu zapodać tego linka, bo tak na prawdę moje pytanie do tego się sprowadzało. Nie rozumiem po prostu dlaczego ten "return" powoduje rozwiązanie problemu.

https://poopcode.com/error-err_http_headers_sent-cannot-set-headers-after-they-are-sent-to-the-client-how-to-fix/

Bo w tym tutorialu piszą, że trzeba zrobić, ale nie tłumaczą dlaczego. Tzn. coś wyjaśniają, ale nie piszą dlaczego akurat return.

1

W linku, który podałeś jest coś takiego

if(total > 0) {
  return res.status(200).send({status: 0, message: "Messages available"});
}

// Tutaj jeśli jest to ostatnia linijka w funkcji 
// to return nie jest potrzebny. 
// Te metody modyfikują obiekt `res` z tego co pamiętam
// i raczej olewają zwracaną wartość.
return res.status(503).send({status: 1, message: "Messages not available!"}); 

oraz identyczna wersja bez żadnego return.

W przypadku, gdy ten if, zwróci false, wywoła się ten dolny response i API wyślę odpowiedź o statusie 503 i wiadomości XXX.

Tylko problem w tym, że metody res.status, res.send nie przerywają funkcji i jeśli jest jakiś dalszy kod to leci on dalej :]

Więc żeby temu zaradzić można dodać return, albo jakieś if else. Głównie chodzi o to, żeby skonstruować taki przebieg funkcji, gdzie metody res.status i res.send wywoływane są jedynie raz. W każdym requescie do API może być tylko jedna odpowiedź.

Tutaj przykład z if else

if(total > 0) {
  res.status(...).send(...);
} else {
  res.status(...).send(...)
}

To zależy od biblioteki z jakiej korzystamy do tworzenia API, ale większość z nich ignoruje wartość jaką zwrócimy z return i służy to jedynie do przerwania funkcji

if(total > 0) {
  res.status(...).send(...);
  return; // funkcja nic nie zwraca, czyli mamy undefined
}

res.status(...).send(...)

Ten link https://www.codementor.io/@oparaprosper79/understanding-node-error-err_http_headers_sent-117mpk82z8 powinien lepiej to opisywać

1 użytkowników online, w tym zalogowanych: 0, gości: 1