2017-08-12 1 views
1

Je rencontre un problème avec mon application native réagissant à mon API Node. Lorsque j'essaie de publier des données pour mettre à jour certaines valeurs dans la base de données via un noeud (qui passe ensuite à une procédure stockée), j'obtiens un 500 - Impossible de définir les en-têtes après leur envoi dans Noeud. Tout ce que je peux trouver dit que cela pourrait être dû à l'envoi de réponses deux fois. Je ne pense pas que ce soit le cas ici. J'ai testé dans le facteur et les choses fonctionnent bien, il renvoie un statut de 200 avec les bonnes données renvoyées.React Native/Node API: Impossible de définir les en-têtes après leur envoi

Je suis en train de publier des données sur l'API comme ceci:

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

Je reçois sur le côté de l'API et de transmettre les données à une procédure stockée avec ceci:

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

Tous des idées?

EDIT:

Je ne sais pas si cela me dit quelque chose, mais je suis connecté le message d'erreur à la console:

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: Got it. J'avais besoin de recevoir les valeurs comme req.body.id, req.body.minage, etc ... pas comme req.body [0] .id. Bizarre d'avoir une erreur comme ça mais qui a résolu l'erreur.

Répondre

0

Si vous voyez un comportement différent dans postier, c'est parce que postier fait exactement le POST directement alors que le navigateur ne place un CORS preflight OPTIONS request avant d'essayer le POST.

Il semble donc que la demande qui est à l'origine du « Impossible de définir les en-têtes après leur envoi » vous voyez est que OPTIONS demande, pas la demande POST.

Vous pouvez confirmer cela en envoyant une demande OPTIONS à postier, et en veillant à fournir également un en-tête de demande Origin dans le cadre de la demande. Avec curl vous pouvez le faire comme ceci:

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

qui produira probablement la même erreur 500 que vous voyez de la demande du navigateur.

En ce qui concerne la façon de résoudre ce problème, je pense que personne d'autre ici ne peut vous le dire sans voir beaucoup plus de code côté serveur. Mais ce qui semble se résumer à cela, quelque part dans votre code, vous avez un ou plusieurs endroits avec la logique pour traiter les demandes OPTIONS, et quelque part dans ce code de manipulation OPTIONS, il essaie d'envoyer les en-têtes après qu'ils ont déjà été envoyés.

Pour savoir où cela se trouve, il semble que vous souhaitiez consulter les journaux du serveur côté serveur et trouver les messages qui sont consignés lorsque cette erreur 500 se produit. Et en passant, dans ce cas, la chose qui déclenche le navigateur pour faire une demande COR 0flash OPTIONS pour commencer est la partie myHeaders.append('Content-Type', 'application/json').

+0

Salut sideshow, merci pour la réponse. Je pourrais me tromper complètement, mais cela ne semble pas être le problème. J'ai envoyé la requête d'options via curl et j'ai reçu une réponse de 200 - ce qui semblerait indiquer que tout va bien ... J'ai aussi plusieurs autres points de terminaison API (qui ressemblent à peu près au même, noms et paramètres de procédure stockée) ça fonctionne bien. J'ai mis à jour mon message avec le message d'erreur. Le reste de l'application est à peu près une installation de nœud standard - je n'ai pas beaucoup changé. – nab1994

+0

OK, je ne sais pas combien la réponse a réellement aidé, mais je vous vois de votre mise à jour à la question que vous avez réussi à trouver la cause et à la réparer, donc je suis content de vous entendre trouver la solution :) – sideshowbarker