2017-08-12 1 views
1

Ich habe ein Problem mit meiner reagierenden nativen App, die mit meiner Node-API interagiert. Wenn ich versuche, Daten zu veröffentlichen, um einige Werte in der Datenbank über Knoten (die dann zu einer gespeicherten Prozedur geht) zu aktualisieren, bekomme ich eine 500 - kann Header nicht festlegen, nachdem sie in Node gesendet werden.React Native/Node-API: Kann Header nicht festlegen, nachdem sie gesendet werden

Alles, was ich finden kann, sagt, dass dies daran liegen könnte, Antworten zweimal zu senden. Ich denke nicht, dass das hier der Fall ist. Ich habe im Postboten getestet und die Dinge funktionieren gut, es gibt einen Status von 200 mit den richtigen zurückgegebenen Daten zurück.

Ich versuche, Daten an die API zu schreiben, wie so:

const myHeaders = new Headers(); 
    myHeaders.append('Content-Type', 'application/json'); 


    fetch(`http://localhost:3000/user/preferences`, { 
     method: 'POST', 
     headers: myHeaders, 
     mode: 'cors', 
     cache: 'default', 
     body: JSON.stringify({ 
     id: '1', 
     minage: this.state.minageValue, 
     maxage: this.state.maxageValue 
     }) 
    }) 
     .then(response => response.json()) 
     .then(body => console.log(body)) 
     .catch(err => console.log(err)); 

ich es auf der API-Seite und Weitergabe der Daten an eine gespeicherte Prozedur mit diesem empfange: Jede

function updatePreferences(req, res, next) { 
    console.log(req); 
    var userid = req.body[0].id; 
    var minage = req.body[0].minage; 
    var maxage = req.body[0].maxage; 

    db.func('___spsavepreferences', [userid, minage, maxage]) 
     .then(function(data){ 
      res.status(200) 
       .json({ 
        status: 'success', 
        preferences: data 
       }); 
     }); 
} 

Ideen?

EDIT:

Sie wissen nicht, ob diese mir etwas erzählt, aber ich habe die Fehlermeldung an der Konsole angemeldet:

Error: Can't set headers after they are sent. 
at validateHeader (_http_outgoing.js:504:11) 
at ServerResponse.setHeader (_http_outgoing.js:511:3) 
at ServerResponse.header (/Users/user/Projects/Project_node/node_modules/express/lib/response.js:730:10) 
POST /user/preferences 500 410.809 ms - 189 
    at ServerResponse.send (/Users/user/Projects/Project_node/node_modules/express/lib/response.js:170:12) 
    at done (/Users/user/Projects/Project_node/node_modules/express/lib/response.js:967:10) 
    at Object.exports.renderFile (/Users/user/Projects/Project_node/node_modules/jade/lib/index.js:374:12) 
    at View.exports.__express [as engine] (/Users/user/Projects/Project_node/node_modules/jade/lib/index.js:417:11) 
    at View.render (/Users/user/Projects/Project_node/node_modules/express/lib/view.js:128:8) 
    at tryRender (/Users/user/Projects/Project_node/node_modules/express/lib/application.js:640:10) 
    at Function.render (/Users/user/Projects/Project_node/node_modules/express/lib/application.js:592:3) 
    at ServerResponse.render (/Users/user/Projects/Project_node/node_modules/express/lib/response.js:971:7) 
    at /Users/user/Projects/Project_node/app.js:51:7 
    at Layer.handle_error (/Users/user/Projects/Project_node/node_modules/express/lib/router/layer.js:71:5) 
    at trim_prefix (/Users/user/Projects/Project_node/node_modules/express/lib/router/index.js:315:13) 
    at /Users/user/Projects/Project_node/node_modules/express/lib/router/index.js:284:7 
    at Function.process_params (/Users/user/Projects/Project_node/node_modules/express/lib/router/index.js:335:12) 

EDIT 2: Verstanden. Ich brauchte die Werte als req.body.id, req.body.minage, etc ... nicht als req.body [0] .id. Seltsam, um einen Fehler zu bekommen, aber das hat den Fehler behoben.

Antwort

0

Wenn Sie ein anderes Verhalten in Postbote sind zu sehen, ist das, weil Postbote nur die POST direkt tut, während der Browser stattdessen eine CORS preflight OPTIONS request tut, bevor die POST versuchen.

So klingt es wie die Anforderung, dass die verursacht „gesetzt Kann nicht Header, nachdem sie gesendet werden“ Sie sehen, ist, dass OPTIONS Anfrage, nicht die POST Anfrage.

Sie können dies bestätigen, indem Sie eine OPTIONS Anfrage mit Postbote senden und sicherstellen, dass Sie auch einen Origin Anfragekopf als Teil der Anfrage angeben. Mit curl können Sie das wie folgt tun:

curl -X OPTIONS -i -H 'Origin: http://x.y' http://localhost:3000/user/preferences 

, die wahrscheinlich den gleichen Fehler 500 erzeugen sind Sie aus der Browser-Anfrage zu sehen.

Soweit, wie es zu beheben, ich denke, es gibt keine Möglichkeit, die jemand anderes hier Ihnen sagen könnte, ohne viel mehr von Ihrem Server-Side-Code zu sehen. Aber wie es scheint, irgendwo in Ihrem Code haben Sie einen oder mehrere Orte mit Logik für die Verarbeitung von OPTIONS Anfragen, und irgendwo in diesem OPTIONS -Handling-Code, es versucht, Header zu senden, nachdem sie bereits gesendet wurden.

Um herauszufinden, wo das ist, scheint es, als ob Sie durch die Serverprotokolle auf der Serverseite suchen und jede Nachricht finden möchten, die protokolliert wird, wenn dieser 500 Fehler auftritt.

Und übrigens, in diesem Fall ist die Sache, die den Browser auslöst, eine COR Preflight OPTIONS Anfrage zu beginnen, mit dem myHeaders.append('Content-Type', 'application/json') Teil zu tun.

+0

Hallo Nebenschau, danke für die Antwort. Ich könnte völlig falsch liegen, aber das scheint nicht das Problem zu sein. Ich habe die Optionswünsche über curl geschickt und eine Antwort von 200 erhalten - was darauf hindeutet, dass alles gut ist ... Ich habe auch mehrere andere API-Endpunkte (die ziemlich genau gleich aussehen, nur verschiedene Stored Procedure-Namen und -Parameter) das funktioniert gut. Ich habe meinen Beitrag mit der Fehlermeldung aktualisiert. Der Rest der App ist so ziemlich eine Standard-Node-Installation - ich habe nicht viel geändert. – nab1994

+0

OK nicht sicher, wie sehr die Antwort tatsächlich geholfen hat, aber ich sehe dich von deinem Update auf die Frage, dass du es geschafft hast, die Ursache aufzuspüren und zu beheben, also bin ich nur froh zu hören, dass du die Lösung gefunden hast :) – sideshowbarker

Verwandte Themen