FOUT: kan geen kopteksten instellen nadat ze naar de Klant worden verzonden

Ik ben redelijk nieuw voor Node.Js en ik heb wat problemen.

Ik gebruik NODE.JS 4.10 en express 2.4.3.

Wanneer ik probeer toegang te krijgen tot http://127.0.0.1:8888/auth/facebook , ik word doorgestuurd naar http://127.0.0.1:8888/autut/facebook_callback .

Ik heb vervolgens de volgende fout ontvangen:

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)

Het volgende is mijn code:

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);

Mag ik weten wat er mis is met mijn code?


Antwoord 1, Autoriteit 100%

Het resobject in Express is een subklasse van http.ServerResponsevan Node.js (lees de http.js-bron). Je mag res.setHeader(name, value)zo vaak aanroepen als je wilt totdat je res.writeHead(statusCode)aanroept. Na writeHeadworden de headers ingebakken en kun je alleen res.write(data)aanroepen, en tot slot res.end(data).

De fout “Fout: Kan headers niet instellen nadat ze zijn verzonden.” betekent dat u zich al in de status Body of Finished bevindt, maar dat een functie heeft geprobeerd een header of statusCode in te stellen. Als je deze fout ziet, probeer dan te zoeken naar iets dat probeert een koptekst te verzenden nadat een deel van de hoofdtekst al is geschreven. Zoek bijvoorbeeld naar callbacks die per ongeluk twee keer worden aangeroepen, of een fout die optreedt nadat de body is verzonden.

In jouw geval heb je res.redirect()aangeroepen, waardoor het antwoord Voltooid werd. Vervolgens heeft je code een fout gegenereerd (res.reqis null). en aangezien de fout zich voordeed binnen uw werkelijke function(req, res, next)(niet binnen een callback), kon Connect deze opvangen en vervolgens een 500-foutpagina verzenden. Maar aangezien de headers al waren verzonden, veroorzaakte setHeadervan Node.js de fout die je zag.

Uitgebreide lijst met Node.js/Express-antwoordmethoden en wanneer ze moeten worden aangeroepen:

Reactie moet in Headstaan en blijft in Head:

  1. res.writeContinue()
  2. res.statusCode = 404
  3. res.setHeader(name, value)
  4. res.getHeader(name)
  5. res.removeHeader(name)
  6. res.header(key[, val])(alleen Express)
  7. res.charset = 'utf-8'(Alleen Express; alleen van invloed op Express-specifieke methoden)
  8. res.contentType(type)( Alleen Express)

Reactie moet in Hoofdzijn en wordt Body:

  1. res.writeHead(statusCode, [reasonPhrase], [headers])

Reactie kan in Head/Bodyzijn en blijft in Body:

  1. res.write(chunk, encoding='utf8')

Reactie kan in Head/Bodyzijn en wordt Voltooid:

  1. res.end([data], [encoding])

Reactie kan in Head/Bodyzijn en blijft in de huidige staat:

  1. res.addTrailers(headers)

Reactie moet in Headzijn en wordt Voltooid:

  1. return next([err])(alleen Connect/Express)
  2. Alle uitzonderingen binnen middleware function(req, res, next)(alleen Connect/Express)
  3. res.send(body|status[, headers|status[, status]])(alleen Express)
  4. res.attachment(filename)( Alleen Express)
  5. res.sendfile(path[, options[, callback]])(alleen Express)
  6. res.json(obj[, headers|status[, status]])(alleen Express)
  7. res.redirect(url[, status])(alleen Express)
  8. res.cookie(name, val[, options])(alleen Express)
  9. res.clearCookie(name[, options])(alleen Express)
  10. res.render(view[, options[, fn]])(alleen Express)
  11. res.partial(view[, options])(alleen Express)

Antwoord 2, autoriteit 10%

Ik kwam deze fout ook een tijdje tegen. Ik denk (hoop) dat ik er mijn hoofd omheen heb gewikkeld en het hier ter referentie wilde schrijven.

Wanneer u middleware toevoegt aan connectof express(die is gebouwd op connect) met behulp van de app.use-methode, voegt u items toe aan Server.prototype.stackin connect (tenminste met de huidige npm install connect, die er heel anders uitziet dan die ene github vanaf dit bericht). Wanneer de server een verzoek ontvangt, herhaalt deze de stapel en roept de (request, response, next)-methode aan.

Het probleem is dat als in een van de middleware-items naar de hoofdtekst of headers van het antwoord wordt geschreven (het lijkt alsof het of/of is), maar response.end()en je roept next()aan en als de kernmethode Server.prototype.handleis voltooid, zal het opvallen dat:

  1. er zijn geen items meer in de stapel, en/of
  2. dat response.headerSentwaar is.

Dus er wordt een fout gegenereerd. Maar de fout die het veroorzaakt is slechts dit basisantwoord (van de connect http.jsbroncode:

res.statusCode = 404;
res.setHeader('Content-Type', 'text/plain');
res.end('Cannot ' + req.method + ' ' + req.url);

Daar roept het res.setHeader('Content-Type', 'text/plain');aan, wat je waarschijnlijk hebt ingesteld in je rendermethode, zonder response.end()aan te roepen, zoiets als:

response.setHeader("Content-Type", "text/html");
response.write("<p>Hello World</p>");

De manier waarop alles moet worden gestructureerd is als volgt:

Goede middleware

// middleware that does not modify the response body
var doesNotModifyBody = function(request, response, next) {
  request.params = {
    a: "b"
  };
  // calls next because it hasn't modified the header
  next();
};
// middleware that modify the response body
var doesModifyBody = function(request, response, next) {
  response.setHeader("Content-Type", "text/html");
  response.write("<p>Hello World</p>");
  response.end();
  // doesn't call next()
};
app.use(doesNotModifyBody);
app.use(doesModifyBody);

Problematische middleware

var problemMiddleware = function(request, response, next) {
  response.setHeader("Content-Type", "text/html");
  response.write("<p>Hello World</p>");
  next();
};

De problematische middleware stelt de responsheader in zonder response.end()aan te roepen en roept next()aan, wat de server van connect in de war brengt.


Antwoord 3, autoriteit 8%

Sommige antwoorden in deze Q&A zijn fout. Het geaccepteerde antwoord is ook niet erg “praktisch”, dus ik wil een antwoord plaatsen dat de dingen in eenvoudiger bewoordingen uitlegt. Mijn antwoord dekt 99% van de fouten die ik keer op keer zie. Bekijk het geaccepteerde antwoord voor de werkelijke redenen achter de fout.


HTTP gebruikt een cyclus die één reactie per verzoek vereist. Wanneer de client een verzoek verzendt (bijv. POST of GET), mag de server er slechts één antwoord naar terugsturen.

Deze foutmelding:

Fout: kan geen headers instellen nadat ze zijn verzonden.

Gebeurt meestal wanneer u meerdere reacties op één verzoek verzendt. Zorg ervoor dat de volgende functies slechts één keer per verzoek worden aangeroepen:

  • res.json()
  • res.send()
  • res.redirect()
  • res.render()

(en nog een paar die zelden worden gebruikt, controleer het geaccepteerde antwoord)

De route-callback zal niet terugkeren wanneer deze res-functies worden aangeroepen. Het blijft draaien totdat het het einde van de functie of een return-instructie bereikt. Als u wilt terugkeren bij het verzenden van een antwoord, kunt u dit als volgt doen: return res.send().


Neem bijvoorbeeld deze code:

app.post('/api/route1', function(req, res) {
  console.log('this ran');
  res.status(200).json({ message: 'ok' });
  console.log('this ran too');
  res.status(200).json({ message: 'ok' });
}

Wanneer een POST-verzoek wordt verzonden naar /api/route1, wordt elke regel in de callback uitgevoerd. Het foutbericht Kan headers niet instellen nadat ze zijn verzondenwordt gegenereerd omdat res.json()twee keer wordt aangeroepen, wat betekent dat er twee reacties worden verzonden.

Er kan slechts één reactie per verzoek worden verzonden!


De fout in het bovenstaande codevoorbeeld was duidelijk. Een meer typisch probleem is wanneer je meerdere branches hebt:

app.get('/api/company/:companyId', function(req, res) {
  const { companyId } = req.params;
  Company.findById(companyId).exec((err, company) => {
      if (err) {
        res.status(500).json(err);
      } else if (!company) {
        res.status(404).json();      // This runs.
      }
      res.status(200).json(company); // This runs as well.
    });
}

Deze route met bijgevoegde callback vindt een bedrijf in een database. Als we een vraag stellen voor een bedrijf dat niet bestaat, komen we in de else if-tak en sturen we een 404-antwoord. Daarna gaan we verder met de volgende verklaring die ook een reactie stuurt. Nu hebben we twee reacties verzonden en de foutmelding zal verschijnen. We kunnen deze code corrigeren door ervoor te zorgen dat we slechts één reactie sturen:

.exec((err, company) => {
  if (err) {
    res.status(500).json(err);
  } else if (!company) {
    res.status(404).json();         // Only this runs.
  } else {
    res.status(200).json(company);
  }
});

of door terug te keren wanneer het antwoord is verzonden:

.exec((err, company) => {
  if (err) {
    return res.status(500).json(err);
  } else if (!company) {
    return res.status(404).json();  // Only this runs.
  }
  return res.status(200).json(company);
});

Een grote zondaar is asynchrone functies. Neem de functie van dit vraag , bijvoorbeeld:

article.save(function(err, doc1) {
  if (err) {
    res.send(err);
  } else {
    User.findOneAndUpdate({ _id: req.user._id }, { $push: { article: doc._id } })
    .exec(function(err, doc2) {
      if (err) res.send(err);
      else     res.json(doc2);  // Will be called second.
    })
    res.json(doc1);             // Will be called first.
  }
});

Hier hebben we een asynchrone functie (findOneAndUpdate()) in het codemonster. Als er geen fouten zijn (err) findOneAndUpdate()WORDT GESCHIKKEN. Omdat deze functie asynchroon is, wordt de res.json(doc1)onmiddellijk gebeld. Stel dat er geen fouten zijn in findOneAndUpdate(). De res.json(doc2)in de elsewordt dan gebeld. Twee reacties zijn nu verzonden en de kan geen kopers instellen foutmelding.

De oplossing zou in dit geval zijn om de res.json(doc1)te verwijderen. Om beide documenten terug te sturen naar de client, kan de res.json()in het andere worden geschreven als res.json({ article: doc1, user: doc2 }).


Antwoord 4, Autoriteit 5%

Ik had ditzelfde probleem en besefte dat het was omdat ik res.redirectzonder een returnverklaring, dus de nextfunctie was ook onmiddellijk achteraf gebeld:

auth.annonymousOnly = function(req, res, next) {
    if (req.user) res.redirect('/');
    next();
};

Wat had moeten zijn:

auth.annonymousOnly = function(req, res, next) {
    if (req.user) return res.redirect('/');
    next();
};

Antwoord 5, autoriteit 4%

Veel mensen krijgen deze fout. Het is een verwarrend dit met asynchrone verwerking. Hoogstwaarschijnlijk stelt een deel van uw code headers in bij het eerste vinkje en voert u vervolgens een asynchrone callback uit in een toekomstig vinkje. Tussendoor wordt de responsheader verzonden, maar dan proberen verdere headers (zoals een 30X-omleiding) extra headers toe te voegen, maar het is te laat omdat de responsheader al is verzonden.

Ik weet niet precies wat uw fout veroorzaakt, maar beschouw eventuele terugbelverzoeken als mogelijke gebieden om te onderzoeken.

Een eenvoudige tip om uw code te vereenvoudigen. Ontdoe u van app.configure()en bel app.userechtstreeks in uw hoofdbereik.

Zie ook de everyauth-module, die Facebook en een tiental andere authenticatieproviders van derden doet.


Antwoord 6, autoriteit 2%

Dit type fout krijg je als je verklaringen doorgeeft na het verzenden van een reactie.

Bijvoorbeeld:

res.send("something response");
console.log("jhgfjhgsdhgfsdf");
console.log("sdgsdfhdgfdhgsdf");
res.send("sopmething response");

Resulteert in de fout die u ziet, want zodra het antwoord is verzonden, wordt de volgende res.sendniet uitgevoerd.

Als je iets wilt doen, moet je dat doen voordat je het antwoord verzendt.


Antwoord 7

Ik heb mijn hoofd over deze kwestie gekookt en het is gebeurd vanwege een zorgeloze fout bij het hanteren van de callbacks. Niet-geretourneerde callbacks laten het antwoord tweemaal worden ingesteld.!

Mijn programma had een code die verzoek en vraag de DB te valideren. Na het valideren als er fout is, belde ik de index.js met de validatiefouten.
En als validatie passeert, gaat het door en druk op de DB met succes / falen.

   var error = validateRequestDetails("create",queryReq);
    if (error)
        callback(error, null);
   else
    some code 
    callback(null, success);

Wat er gebeurt is: Incase-validatie mislukt de terugbellen die wordt genoemd en reageren wordt ingesteld. Maar niet geretourneerd. Dus het gaat nog steeds door de methode gaat naar DB en raakt succes / falen. Het roept weer dezelfde callback toe, waardoor het antwoord nu twee keer wordt ingesteld.

Dus oplossing is eenvoudig, u moet de callback “retourneren” zodat de methode niet doorgaat met het uitvoeren, zodra de fout is opgetreden en zo het antwoordobject eenmaal instelt

 var error = validateRequestDetails("create",queryReq);
    if (error)
        callback(error, null);
        return;
    else
       some code 
       callback(null, success);

Antwoord 8

Soms krijg je deze foutmelding wanneer je probeert de volgende () functie na Res.D te bellen of Res.Send , probeer te verwijderen als je volgende hebt () na Res.Send of Res.D.D in uw functie.
Opmerking: hier Volgende () betekent na het reageren op de client met uw reactie (IE Res.Send of Res.D ) U probeert nog een code uit te voeren om opnieuw te reageren, zodat het niet legaal is.

Voorbeeld:

router.get('/',function (req,res,next){
     res.send("request received");
     next(); // this will give you the above exception 
});

verwijder next()van bovenstaande functie en het zal werken.


Antwoord 9

fout vanzelf gevonden na een RND :

1) mijn foutcode :

return res.sendStatus(200).json({ data: result });

2) mijn succescode

return res.status(200).json({ data: result });

het verschil is dat ik sendStatus()heb gebruikt in plaats van status().


Antwoord 10

Als je terugbelfuncties gebruikt, gebruik dan returnna het err-blok. Dit is een van de scenario’s waarin deze fout kan optreden.

userModel.createUser(data, function(err, data) {
    if(err) {
      res.status = 422
      res.json(err)
      return // without this return the error can happen.
    }
    return res.json(data)
  })

Getest op Node-versie v10.16.0en express 4.16.4


Antwoord 11

Deze fout treedt op wanneer u 2 reacties verzendt. Bijvoorbeeld:

if(condition A)
{ 
      res.render('Profile', {client:client_});
}
if (condition B){
      res.render('Profile', {client:client_});
    }
  }

Stel je voor dat om de een of andere reden voorwaarde A en B waar zijn, dus in de tweede renderkrijg je die fout


Antwoord 12

In mijn geval was het een 304-reactie (caching) die het probleem veroorzaakte.

Eenvoudigste oplossing:

app.disable('etag');

Alternatieve oplossing hier als u meer controle wilt:

http://vlasenko.org/2011/10/12/expressconnect-static-set-last-modified-to-now-to-avoid-304-not-modified/


Antwoord 13

Voor iedereen die hiertoe komt en geen van de andere oplossingen heeft geholpen, in mijn geval manifesteerde dit zich op een route die het uploaden van afbeeldingen afhandelde, maar geen time-outsafhandelde, en dus als de upload te lang duurde en een time-out had, toen de callback werd geactiveerd nadat de time-outreactie was verzonden, resulteerde het aanroepen van res.send() in de crash omdat de headers al waren ingesteld op account voor de time-out.

Dit was gemakkelijk te reproduceren door een zeer korte time-out in te stellen en de route te volgen met een behoorlijk grote afbeelding, de crash werd elke keer gereproduceerd.


Antwoord 14

In mijn geval gebeurde dit met React en postal.js toen ik me niet afmeldde voor een kanaal in de componentWillUnmountcallback van mijn React-component.


Antwoord 15

Ik voeg eenvoudig het return-sleutelwoord toe, zoals:
return res.redirect("/great");en walla!


Antwoord 16

er is iets anders dat deze fout veroorzaakt en dat is wanneer u het trefwoord returnniet toevoegt vóór res.send, res.json, enz…


Antwoord 17

Ik heb dit net geleund. U kunt de antwoorden via deze functie doorgeven:

app.use(function(req,res,next){
  var _send = res.send;
  var sent = false;
  res.send = function(data){
    if(sent) return;
    _send.bind(res)(data);
    sent = true;
};
  next();
});

Antwoord 18

Voeg deze MIDDLWARE toe en het werkt

app.use(function(req,res,next){
 var _send = res.send;
var sent = false;
res.send = function(data){
    if(sent) return;
    _send.bind(res)(data);
    sent = true;
};
next();
});

Antwoord 19

Dit gebeurt wanneer reactie werd afgeleverd aan de klant en opnieuw probeert u antwoord te geven. U moet uw code inchecken die u ergens weer reageren op Cliënt retourneert, wat deze fout veroorzaakt. Controleer en retourneer een keer wanneer u wilt terugkeren.


Antwoord 20

Het is zeer waarschijnlijk dat dit meer een knooppunt ding is, 99% van de tijd is het een dubbele callback waardoor u twee keer of volgende () tweemaal zo) reageert Het loste mijn probleem op met behulp van de volgende () in een lus. Verwijder de volgende () van de lus of stop deze meer dan één keer te bellen.


Antwoord 21

Controleer of uw code meerdere res.send()–verklaringen voor één verzoek retourneert. Zoals toen ik dit probleem had ….

Ik was dit probleem in mijn toepassing Knooppunt. De fout was dat

switch (status) {
    case -1:
      res.send(400);
    case 0:
      res.send(200);
    default:
      res.send(500);
}

Ik gebruikte verschillende gevallen met behulp van Switch zonder pauze te schrijven. Voor degenen die weinig vertrouwd zijn met switch-case, weet dat zonder pauze, rijd trefwoorden terug. De code onder Case en Volgende regels zullen worden uitgevoerd, wat er ook gebeurt. Dus ook al wil ik single res.sendsturen, vanwege deze fout, het terugstuur van meerdere res.sendVerklaringen, die

heeft gevraagd

FOUT: kan niet headers instellen nadat ze naar de klant worden verzonden.

Wat is opgelost door dit toe te voegen of return te gebruiken voor elke res.send()-methode zoals return res.send(200)

switch (status) {
    case -1:
      res.send(400);
      break;
    case 0:
      res.send(200);
      break;
    default:
      res.send(500);
      break;
}

Antwoord 22

Ik had dit probleem toen ik beloften aan het nestelen was. Een belofte in een belofte zou 200 naar de server terugsturen, maar dan zou de catch-statement van de buitenste belofte een 500 teruggeven. Toen ik dit eenmaal had opgelost, was het probleem verdwenen.


Antwoord 23

In mijn geval gebeurt het door meerdere callbacks. Ik heb de methode next()meerdere keren aangeroepen tijdens de code


Antwoord 24

Kwam hier van nuxt, het probleem zat in de asyncData-methode van de component, ik vergat de belofte returndie gegevens ophaalde en de header instelde daar.


Antwoord 25

Ik kreeg een soortgelijke fout toen ik probeerde een antwoord te verzenden binnen een lusfunctie. De eenvoudige oplossing was om de

res.send(‘send response’);

uit de lus omdat je de antwoordheader maar één keer kunt verzenden.

https://www.tutorialspoint.com/nodejs/nodejs_response_object.htm


Antwoord 26

Ik had hetzelfde probleem dat werd veroorzaakt door mangoest.

om dit op te lossen moet u Promisesinschakelen, zodat u: mongoose.Promise = global.Promiseaan uw code kunt toevoegen, waardoor u native js promises.

andere alternatieven voor deze oplossing zijn:

var mongoose = require('mongoose');
// set Promise provider to bluebird
mongoose.Promise = require('bluebird');

en

// q
mongoose.Promise = require('q').Promise;

maar u moet deze pakketten eerst installeren.


Antwoord 27

Zoek in uw app.get om de status niet in te stellen vóór res.send(“uw resultaat”);

Ik heb zojuist :

. verwijderd

res.sendStatus(200);

en de reactie werkt daarna !!!

res.send("your result");

Antwoord 28

Het probleem bestond uit de /auth/facebook-route om dingen gemakkelijk te begrijpen te maken. Als u eenmaal een reactie van de client hebt verzonden, mag u GEEN andere functies hieronder instellen voor het volgende vervolgblok , het is ook gerelateerd aan het synchroon zijn met JavaScript,

voor een goed begrip is het ook net als;

async function getRequest(){
   let data = await API.get();
   return data;
   let json = data.json();
}

in jouw geval, console.log("ok cool.");en console.log(res['req']['session'])moeten wees eerder op res.redirect(|/great")

Ik hoop dat het logisch is, welkom 🙂


Antwoord 29

In Typescript was mijn probleem dat ik de websocket-verbinding niet sloot na ontvangst van een bericht.

WebSocket.on("message", (data) => {
    receivedMessage = true;
    doSomething(data);
    localSocket.close(); //This close the connection, allowing 
});

Antwoord 30

Als je geen hulp van boven krijgt: voor noobs
De reden achter deze fout is dat het verzoek meerdere keren wordt verzonden, laten we het in sommige gevallen begrijpen: –
1. `

module.exports = (req,res,next)=>{
        try{
           const decoded  = jwt.verify(req.body.token,"secret");
           req.userData = decoded;
           next();
        }catch(error){
            return res.status(401).json({message:'Auth failed'});
        }
        next();   
        }

`
in het bovenstaande twee keer next() aanroepen zal een fout opleveren


  1. 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);*
    })
    })

hier is reageren twee keer verzenden controleer of je al een reactie hebt gestuurd

Other episodes