Jestem dość nowy w Node.js i mam pewne problemy.
Używam Node.js 4.10 i Express 2.4.3.
Kiedy próbuję uzyskać dostęp do http://127.0.0.1:8888/auth/facebook , nastąpi przekierowanie do http://127.0.0.1:8888/auth/facebook_callback .
Następnie otrzymałem następujący błąd:
Error: Can't render headers after they are sent to the client.
at ServerResponse.<anonymous> (http.js:573:11)
at ServerResponse._renderHeaders (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/patch.js:64:25)
at ServerResponse.writeHead (http.js:813:20)
at /home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect-auth/lib/auth.strategies/facebook.js:28:15
at /home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect-auth/lib/index.js:113:13
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect-auth/lib/strategyExecutor.js:45:39)
at [object Object].pass (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect-auth/lib/authExecutionScope.js:32:3)
at [object Object].halt (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect-auth/lib/authExecutionScope.js:29:8)
at [object Object].redirect (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect-auth/lib/authExecutionScope.js:16:8)
at [object Object].<anonymous> (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect-auth/lib/auth.strategies/facebook.js:77:15)
Error: Can't set headers after they are sent.
at ServerResponse.<anonymous> (http.js:527:11)
at ServerResponse.setHeader (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/patch.js:50:20)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:162:13)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:195:11)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:150:23)
at param (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/middleware/router.js:189:13)
at pass (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/middleware/router.js:191:10)
at Object.router [as handle] (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/middleware/router.js:197:6)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:198:15)
at Object.auth [as handle] (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect-auth/lib/index.js:153:7)
Error: Can't set headers after they are sent.
at ServerResponse.<anonymous> (http.js:527:11)
at ServerResponse.setHeader (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/patch.js:50:20)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:162:13)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:207:9)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:150:23)
at param (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/middleware/router.js:189:13)
at pass (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/middleware/router.js:191:10)
at Object.router [as handle] (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/middleware/router.js:197:6)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:198:15)
at Object.auth [as handle] (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect-auth/lib/index.js:153:7)
Error: Can't set headers after they are sent.
at ServerResponse.<anonymous> (http.js:527:11)
at ServerResponse.setHeader (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/patch.js:50:20)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:162:13)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:150:23)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:207:9)
at Object.auth [as handle] (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect-auth/lib/index.js:153:7)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:198:15)
at HTTPServer.handle (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:211:3)
at Object.handle (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:105:14)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:198:15)
Error: Can't set headers after they are sent.
at ServerResponse.<anonymous> (http.js:527:11)
at ServerResponse.setHeader (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/patch.js:50:20)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:162:13)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:150:23)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:207:9)
at HTTPServer.handle (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:211:3)
at Object.handle (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:105:14)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:198:15)
at /home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/middleware/session.js:323:9
at /home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/middleware/session.js:338:9
node.js:134
throw e; // process.nextTick error, or 'error' event on first tick
^
Error: Can't set headers after they are sent.
at ServerResponse.<anonymous> (http.js:527:11)
at ServerResponse.setHeader (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/patch.js:50:20)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:162:13)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:207:9)
at /home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/middleware/session.js:323:9
at /home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/middleware/session.js:338:9
at Array.<anonymous> (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/middleware/session/memory.js:57:7)
at EventEmitter._tickCallback (node.js:126:26)
Oto mój kod:
var fbId= "XXX";
var fbSecret= "XXXXXX";
var fbCallbackAddress= "http://127.0.0.1:8888/auth/facebook_callback"
var cookieSecret = "node"; // enter a random hash for security
var express= require('express');
var auth = require('connect-auth')
var app = express.createServer();
app.configure(function(){
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.cookieParser());
app.use(express.session({secret: cookieSecret}));
app.use(auth([
auth.Facebook({
appId : fbId,
appSecret: fbSecret,
callback: fbCallbackAddress,
scope: 'offline_access,email,user_about_me,user_activities,manage_pages,publish_stream',
failedUri: '/noauth'
})
]));
app.use(app.router);
});
app.get('/auth/facebook', function(req, res) {
req.authenticate("facebook", function(error, authenticated) {
if (authenticated) {
res.redirect("/great");
console.log("ok cool.");
console.log(res['req']['session']);
}
});
});
app.get('/noauth', function(req, res) {
console.log('Authentication Failed');
res.send('Authentication Failed');
});
app.get('/great', function( req, res) {
res.send('Supercoolstuff');
});
app.listen(8888);
Czy mogę wiedzieć, co jest nie tak z moim kodem?
javascript
node.js
express
DjangoRocks
źródło
źródło
Odpowiedzi:
res
Obiekt w Express jest podklasą node.js użytkownikahttp.ServerResponse
( czytaj źródła http.js ). Możesz dzwonićres.setHeader(name, value)
tak często, jak chcesz, dopóki nie zadzwoniszres.writeHead(statusCode)
. NastępniewriteHead
nagłówki są upieczone i możesz tylko zadzwonićres.write(data)
, i na koniecres.end(data)
.Błąd „Błąd: nie można ustawić nagłówków po ich wysłaniu”. oznacza, że jesteś już w stanie Body lub Finished, ale jakaś funkcja próbowała ustawić nagłówek lub kod statusu. Gdy zobaczysz ten błąd, spróbuj poszukać czegoś, co spróbuje wysłać nagłówek po napisaniu części treści. Na przykład poszukaj oddzwaniania, które są przypadkowo wywoływane dwukrotnie lub każdego błędu, który pojawia się po wysłaniu treści.
W twoim przypadku zadzwoniłeś
res.redirect()
, co spowodowało zakończenie odpowiedzi. Następnie twój kod zgłosił błąd (res.req
jestnull
). a ponieważ błąd wystąpił w rzeczywistymfunction(req, res, next)
(nie w ramach wywołania zwrotnego), Connect był w stanie go złapać, a następnie próbował wysłać stronę błędu 500. Ale ponieważ nagłówki zostały już wysłane, Node.js zgłosiłsetHeader
błąd, który zobaczyłeś.Wyczerpująca lista metod odpowiedzi Node.js / Express i kiedy należy je wywołać:
Odpowiedź musi być w głowie i pozostaje w głowie :
res.writeContinue()
res.statusCode = 404
res.setHeader(name, value)
res.getHeader(name)
res.removeHeader(name)
res.header(key[, val])
(Tylko ekspres)res.charset = 'utf-8'
(Tylko Express; dotyczy tylko metod specyficznych dla Express)res.contentType(type)
(Tylko ekspres)Odpowiedź musi być w głowie i staje się Ciałem :
res.writeHead(statusCode, [reasonPhrase], [headers])
Odpowiedź może być w Głowie / Ciele i pozostaje w Ciele :
res.write(chunk, encoding='utf8')
Odpowiedź może być w dowolnej Głowie / Ciele i kończy się :
res.end([data], [encoding])
Odpowiedź może być w dowolnej głowie / ciele i pozostaje w obecnym stanie:
res.addTrailers(headers)
Odpowiedź musi być w głowie i kończy się :
return next([err])
(Tylko Connect / Express)function(req, res, next)
(tylko Connect / Express)res.send(body|status[, headers|status[, status]])
(Tylko ekspres)res.attachment(filename)
(Tylko ekspres)res.sendfile(path[, options[, callback]])
(Tylko ekspres)res.json(obj[, headers|status[, status]])
(Tylko ekspres)res.redirect(url[, status])
(Tylko ekspres)res.cookie(name, val[, options])
(Tylko ekspres)res.clearCookie(name[, options])
(Tylko ekspres)res.render(view[, options[, fn]])
(Tylko ekspres)res.partial(view[, options])
(Tylko ekspres)źródło
return
wcześniejnext()
tego nie robiłem , dzięki temu wskazałem na błąd!Przez jakiś czas również napotkałem ten błąd. Myślę, że (mam nadzieję) owinąłem głowę wokół, chciałem napisać to tutaj w celach informacyjnych.
Kiedy dodajesz oprogramowanie pośrednie do łączenia lub ekspresowe (które jest zbudowane na połączeniu) przy użyciu tej
app.use
metody, dodajesz elementy doServer.prototype.stack
w connect (Przynajmniej z bieżącymnpm install connect
, który wygląda zupełnie inaczej niż jeden github w tym poście). Gdy serwer otrzyma żądanie, iteruje stos, wywołując(request, response, next)
metodę.Problem polega na tym, że jeśli jeden z elementów oprogramowania pośredniego zapisuje w treści odpowiedzi lub nagłówkach (wygląda na to, że jest to albo / lub z jakiegoś powodu), ale nie wywołuje
response.end()
i wywołujesznext()
wtedy, gdyServer.prototype.handle
zakończy się podstawowa metoda, zauważy to że:response.headerSent
jest to prawda.Zgłasza więc błąd. Ale błąd, który zgłasza, to tylko ta podstawowa odpowiedź (z
http.js
kodu źródłowego Connect :W tym miejscu jest to wywołanie
res.setHeader('Content-Type', 'text/plain');
, które prawdopodobnie ustawiłeś w swojejrender
metodzie, bez wywoływania response.end () , coś takiego:Sposób, w jaki wszystko musi być zorganizowane, wygląda następująco:
Dobre oprogramowanie pośrednie
Problematyczne oprogramowanie pośrednie
Problematyczne oprogramowanie pośrednie ustawia nagłówek odpowiedzi bez wywoływania
response.end()
i połączeńnext()
, co dezorientuje serwer Connect.źródło
Niektóre odpowiedzi w tym pytaniu są nieprawidłowe. Przyjęta odpowiedź również nie jest zbyt „praktyczna”, dlatego chcę opublikować odpowiedź, która wyjaśnia rzeczy w prostszy sposób. Moja odpowiedź obejmie 99% błędów, które widzę opublikowanych w kółko. Z rzeczywistych przyczyn błędu spójrz na zaakceptowaną odpowiedź.
HTTP wykorzystuje cykl, który wymaga jednej odpowiedzi na żądanie. Gdy klient wysyła żądanie (np. POST lub GET), serwer powinien odesłać tylko jedną odpowiedź z powrotem.
Ten komunikat o błędzie:
zwykle dzieje się, gdy wysyłasz kilka odpowiedzi na jedno żądanie. Upewnij się, że następujące funkcje są wywoływane tylko raz na żądanie:
res.json()
res.send()
res.redirect()
res.render()
(i kilka innych, które są rzadko używane, sprawdź zaakceptowaną odpowiedź)
Oddzwanianie do trasy nie zostanie zwrócone po wywołaniu tych funkcji res. Będzie działał, dopóki nie osiągnie końca funkcji lub instrukcji return. Jeśli chcesz powrócić przy wysyłaniu odpowiedzi można zrobić to tak:
return res.send()
.Weźmy na przykład ten kod:
Gdy żądanie POST zostanie wysłane do / api / route1 , uruchomi każdą linię w wywołaniu zwrotnym. Nie można ustawić nagłówków po wysłaniu, zostanie wyświetlony komunikat o błędzie, ponieważ
res.json()
jest wywoływany dwukrotnie, co oznacza, że wysyłane są dwie odpowiedzi.Na jedno zapytanie można wysłać tylko jedną odpowiedź!
Błąd w powyższym przykładzie kodu był oczywisty. Bardziej typowym problemem jest posiadanie kilku oddziałów:
Ta trasa z dołączonym wywołaniem zwrotnym znajduje firmę w bazie danych. Wykonując zapytanie dotyczące nieistniejącej firmy, przejdziemy do
else if
oddziału i wyślemy odpowiedź 404. Następnie przejdziemy do następnej instrukcji, która również wysyła odpowiedź. Teraz wysłaliśmy dwie odpowiedzi i pojawi się komunikat o błędzie. Możemy naprawić ten kod, upewniając się, że wysyłamy tylko jedną odpowiedź:lub zwracając, gdy odpowiedź zostanie wysłana:
Wielkim grzesznikiem są funkcje asynchroniczne. Weź funkcję z tego pytania, na przykład:
Tutaj mamy funkcję asynchroniczną (
findOneAndUpdate()
) w przykładzie kodu. Jeśli nie ma żadnych błędów (err
),findOneAndUpdate()
zostanie wywołana. Ponieważ ta funkcja jest asynchroniczna,res.json(doc1)
zostanie wywołana natychmiast. Załóżmy, że nie ma błędów wfindOneAndUpdate()
.res.json(doc2)
Welse
zostanie wywołana. Wysłano teraz dwie odpowiedzi i pojawia się komunikat o błędzie Nie można ustawić nagłówków .W tym przypadku poprawką byłoby usunięcie
res.json(doc1)
. Aby wysłać oba dokumenty z powrotem do klienta,res.json()
w innym można zapisać jakores.json({ article: doc1, user: doc2 })
.źródło
return
res.json
res.send
z pętli for.Miałem ten sam problem i zdałem sobie sprawę, że to dlatego, że dzwoniłem
res.redirect
bezreturn
instrukcji, więcnext
funkcja została również wywołana natychmiast:Które powinny być:
źródło
Wiele osób dotknęło tego błędu. Jest to mylące z przetwarzaniem asynchronicznym. Najprawdopodobniej część kodu ustawia nagłówki w pierwszym ticku, a następnie w przyszłym ticku jest uruchamiane wywołanie zwrotne asynchroniczne. W międzyczasie wysyłany jest nagłówek odpowiedzi, ale następnie kolejne nagłówki (np. Przekierowanie 30X) próbują dodać dodatkowe nagłówki, ale jest już za późno, ponieważ nagłówek odpowiedzi został już przesłany.
Nie jestem pewien, co dokładnie powoduje błąd, ale spójrz na wszelkie wywołania zwrotne jako potencjalne obszary do zbadania.
Jedna prosta wskazówka, aby uprościć kod. Pozbądź się
app.configure()
i po prostu zadzwońapp.use
bezpośrednio w zakresie najwyższego poziomu.Zobacz także moduł everyauth , który obsługuje Facebooka i kilkanaście innych zewnętrznych dostawców uwierzytelnień.
źródło
Gotowałem głowę nad tym problemem i stało się to z powodu nieostrożnego błędu w obsłudze oddzwaniania. nieodwołane wywołania zwrotne powodują dwukrotne ustawienie odpowiedzi.!
Mój program miał kod, który sprawdza poprawność żądania i odpytuje DB. po sprawdzeniu poprawności, czy występuje błąd, oddzwoniłem do pliku index.js z błędami sprawdzania poprawności. A jeśli walidacja się powiedzie, idzie do przodu i trafia do bazy danych z sukcesem / porażką.
Działo się tak: sprawdzanie poprawności incase kończy się niepowodzeniem, wywołanie zwrotne zostaje wywołane, a odpowiedź ustawiona. Ale nie wrócił. Więc nadal trwa, metoda przechodzi do db i osiąga sukces / porażkę. Ponownie wywołuje to samo wywołanie zwrotne, powodując teraz ustawienie odpowiedzi dwukrotnie.
Więc rozwiązanie jest proste, musisz „zwrócić” wywołanie zwrotne, aby metoda nie kontynuowała wykonywania po wystąpieniu błędu, a zatem ustaw obiekt odpowiedzi raz
źródło
callback(...)
bezreturn;
po nim, który ostatecznie spowodował,res.send(...)
że został wywołany dwukrotnie.Ten rodzaj błędu pojawi się, gdy przekażesz instrukcje po wysłaniu odpowiedzi.
Na przykład:
res.send
Spowoduje wyświetlenie błędu, ponieważ po wysłaniu odpowiedzi następujące czynności nie zostaną wykonane.Jeśli chcesz coś zrobić, powinieneś to zrobić przed wysłaniem odpowiedzi.
źródło
Czasami może pojawić się ten błąd, gdy próbujesz wywołać funkcję next () po res.end lub res.send , spróbuj usunąć, jeśli masz next () po res.send lub res.end w swojej funkcji. Uwaga: tutaj next () oznacza, że po udzieleniu odpowiedzi klientowi odpowiedzią ( tj. Res.send lub res.end ) nadal próbujesz wykonać jakiś kod, aby odpowiedzieć ponownie, więc jest to niezgodne z prawem.
Przykład:
źródło
Jeśli korzystasz z funkcji oddzwaniania, użyj
return
poerr
bloku. Jest to jeden ze scenariuszy, w których może wystąpić ten błąd.Testowany na wersji Node
v10.16.0
i ekspresowej4.16.4
źródło
Ten błąd występuje, gdy wyślesz 2 odpowiedzi. Na przykład :
Wyobraź sobie, że z jakiegoś powodu warunki A i B są prawdziwe, więc w drugiej chwili
render
pojawi się ten błądźródło
W moim przypadku przyczyną problemu była odpowiedź 304 (buforowanie).
Najłatwiejsze rozwiązanie:
Alternatywne rozwiązanie tutaj, jeśli chcesz mieć większą kontrolę:
http://vlasenko.org/2011/10/12/expressconnect-static-set-last-modified-to-now-to-avoid-304-not-modified/
źródło
W moim przypadku stało się tak w przypadku React i postal.js, kiedy nie wypisałem się z kanału w
componentWillUnmount
wywołaniu zwrotnym mojego komponentu React.źródło
Dla każdego, kto do tego dojdzie i żadne inne rozwiązanie nie pomogło, w moim przypadku przejawiało się to na trasie, która obsługiwała przesyłanie zdjęć, ale nie radziła sobie z przekroczeniem limitu czasu , a zatem jeśli przesyłanie trwało zbyt długo i upłynęło limit czasu, gdy oddzwanianie zostało uruchomione po wysłaniu odpowiedzi o przekroczeniu limitu czasu wywołanie res.send () spowodowało awarię, ponieważ nagłówki zostały już ustawione na rozliczenie limitu czasu.
Można to łatwo odtworzyć, ustawiając bardzo krótki czas oczekiwania i uderzając w trasę z całkiem dużym obrazem, awaria była odtwarzana za każdym razem.
źródło
Po prostu to pochyliłem. Możesz przekazać odpowiedzi za pomocą tej funkcji:
źródło
Dodaj to oprogramowanie pośrednie i będzie działać
źródło
Dzieje się tak, gdy odpowiedź została dostarczona do klienta i ponownie próbujesz udzielić odpowiedzi. Musisz sprawdzić w kodzie, że gdzieś zwracasz odpowiedź klientowi, co powoduje ten błąd. Sprawdź i zwróć odpowiedź raz, kiedy chcesz wrócić.
źródło
Miałem ten problem, kiedy zagnieżdżałem obietnice. Obietnica zawarta w obietnicy zwróci 200 na serwer, ale wtedy instrukcja catch zewnętrznej obietnicy zwróci 500. Gdy to naprawię, problem zniknie.
źródło
Przyszedł tutaj z nuxt , problem tkwił w
asyncData
metodzie komponentu , zapomniałemreturn
obiecać, że pobierałem dane i ustawiałem tam nagłówek.źródło
Sprawdź, czy kod zwraca wiele instrukcji res.send () dla pojedynczego żądania. Na przykład kiedy miałem ten problem ...
Byłem tym problemem w mojej aplikacji do przywracania węzłów. To był błąd
switch (status) { case -1: res.send(400); case 0: res.send(200); default: res.send(500); }
Zajmowałem się różnymi sprawami za pomocą przełącznika bez przerwy na pisanie. Dla tych, którzy nie znają przypadku przełączników, wiedzą, że bez przerwy zwracają słowa kluczowe. Kod pod znakiem i kolejne wiersze zostaną wykonane bez względu na wszystko. Więc mimo że chcę wysłać pojedynczy res.send, z powodu tego błędu zwracał wiele instrukcji res.send, co skłoniło
switch (status) { case -1: res.send(400); break; case 0: res.send(200); break; default: res.send(500); break; }
źródło
Jest bardzo prawdopodobne, że jest to raczej kwestia węzła, w 99% przypadków jest to podwójne wywołanie zwrotne, które powoduje dwukrotną odpowiedź, lub następne () dwukrotne itd., Cholera. Rozwiązało to mój problem z użyciem next () wewnątrz pętli. Usuń next () z pętli lub przestań wywoływać ją więcej niż jeden raz.
źródło
Wystąpił podobny błąd, gdy próbowałem wysłać odpowiedź w ramach funkcji pętli. Prostym rozwiązaniem było przeniesienie
poza pętlą, ponieważ nagłówek odpowiedzi można wysłać tylko raz.
https://www.tutorialspoint.com/nodejs/nodejs_response_object.htm
źródło
Po prostu dodaję zwrotne słowo kluczowe:
return res.redirect("/great");
i walla!źródło
Miałem ten sam problem, który spowodował mangusta.
naprawić, które musisz włączyć
Promises
, abyś mógł dodać:mongoose.Promise = global.Promise
do swojego kodu, który umożliwia używanienative js promises
.inne alternatywy dla tego rozwiązania to:
i
ale najpierw musisz zainstalować te pakiety.
źródło
błąd znajdź sam po RND:
1) mój kod błędu:
return res.sendStatus(200).json({ data: result });
2) mój kod sukcesu
return res.status(200).json({ data: result });
różnica polega na tym, że użyłem sendStatus () zamiast status () .
źródło
W maszynopisie moim problemem było to, że nie zamknąłem połączenia internetowego po otrzymaniu wiadomości.
źródło
Jeśli nie otrzymujesz pomocy z góry: dla noobs Przyczyną tego błędu jest wielokrotne wysyłanie żądania, daj nam zrozumieć z niektórych przypadków: - 1. `
`w powyższym wywołaniu next () dwa razy spowoduje błąd
router.delete('/:orderId', (req, res, next) => { Order.remove({_id:req.params.orderId},(err,data)=>{ if(err){ **res.status(500).json(err);** }else{ res.status(200).json(data); } *res.status(200).json(data);* }) })
tutaj odpowiedź jest wysyłana dwukrotnie, sprawdź, czy już wysłałeś odpowiedź
źródło
W moim przypadku dzieje się tak z powodu wielu wywołań zwrotnych.
next()
Wielokrotnie wywoływałem metodę podczas koduźródło
Mój problem polegał na tym, że miałem
setInterval
bieg, który miałif/else
blok, w którymclearInterval
metoda znajdowała się welse
:Stawianie
clearInterval
przed tymif/else
zrobiło lewę.źródło
W moim przypadku, w pętli, umieściłem,
res.render()
więc mogłem próbować dzwonić wiele razy.źródło
Wszystko, co musiałem zrobić w przypadku tego błędu, to res.end ().
Innym problemem, z którym możesz się spotkać, jest kod po res.json i res. pisać. W takim przypadku musisz użyć return, aby zatrzymać wykonywanie.
źródło