2017-10-21 2 views
0

J'essaie d'appeler une API REST à partir d'un noeud à l'aide de node-rest-client. Dans le cas où mon appel renvoie une erreur, je veux attraper l'erreur et le signaler à l'appelant.node-rest-client: Impossible de définir les en-têtes après leur envoi.

J'essaie cela avec Postman, malheureusement cela ne fonctionne qu'une seule fois. Lorsque j'appuie sur envoyer la deuxième fois, mon programme node.js se bloque avec l'erreur "Impossible de définir les en-têtes après leur envoi".

Je suis nouveau sur node.js, donc toute aide est très appréciée!

//app stuff 
const client_id = "x"; 
const client_secret = "y"; 
const callback = "https://myurl; 

// Basic Setup 
var http  = require('http'), 
    express = require('express'), 
    mysql = require('mysql'), 
    parser = require('body-parser'), 
    Client = require('node-rest-client').Client; 

var client = new Client(); 

// Setup express 
var app = express(); 
app.use(parser.json()); 
app.use(parser.urlencoded({ extended: true })); 
app.set('port', process.env.PORT || 5000); 

// Set default route 
app.get('/', function (req, res) { 
    res.send('<html><body><p>Welcome to Bank API Wrapper</p></body></html>'); 
}); 

app.post('/authorize', function (req,res) { 
    var response = []; 

    if (typeof req.body.code !== 'undefined' && typeof req.body.state !== 'undefined'){ 
     var code = req.body.code, state = req.body.state; 

     //conversion to base64 because citi api wants it this way 
     var authorization = "Basic " + Buffer.from(client_id + ":" + client_secret).toString('base64'); 

     var args = { 
      data:{"grant_type":"authorization_code","code":code,"redirect_uri":callback}, 
      headers:{"Authorization":authorization,"Content-Type":"application/x-www-form-urlencoded"} 
     }; 

     //get access and refresh token 
     client.post("https://sandbox.apihub.citi.com/gcb/api/authCode/oauth2/token/sg/gcb", args, function (citidata, citiresponse) { 
      //console.log(citidata); 
      //console.log(citiresponse); 
     }); 

     client.on('error', function (err) { 
      response.push({'result' : 'error', 'msg' : 'unauthorized access'}); 
      res.setHeader('Content-Type', 'application/json'); 
      res.status(200).send(JSON.stringify(response)); 
     }); 
    } 
    else { 
     response.push({'result' : 'error', 'msg' : 'Please fill required details'}); 
     res.setHeader('Content-Type', 'application/json'); 
     res.status(200).send(JSON.stringify(response)); 
    } 
}); 


// Create server 
http.createServer(app).listen(app.get('port'), function(){ 
    console.log('Server listening on port ' + app.get('port')); 
}); 
+0

Le programme n'a pas de problème avec la partie « S'il vous plaît remplir les détails requis ». Le problème est avec la section qui dit client.on ('erreur'. Cela ne fonctionne qu'une seule fois.) Après cela, j'obtiens l'erreur "Impossible de définir les en-têtes après leur envoi." –

Répondre

1

Vous avez ceci:

client.on('error', function (err) { 

Ce registre un gestionnaire d'erreur sur le client mais il est alors retiré jamais. Le client est partagé entre les demandes de sorte que toute erreur sur les demandes suivantes lancera toujours les anciens gestionnaires d'erreurs.

Au lieu de cela, vous pouvez écouter une erreur sur la demande. Quelque chose comme ceci:

var request = client.post("... 

request.on('error', function(err) { 
    // handle error 
}); 

Voir https://www.npmjs.com/package/node-rest-client#error-handling

+0

J'ai essayé et obtenu ceci. sur («erreur ") .. attrape l'erreur events.js: 165 jet égariez ^ erreur:. Uncaught, sans précision "erreur".. événement (réponse erreur d'analyse réponse: [{" type » : "mauvaise demande", "code": "400" .... –

+0

Je l'ai résolu en déplaçant var client = nouveau Client(), dans app.post Merci Votre commentaire que le client est partagé entre les demandes est extrêmement utile! Merci –

+1

@JacksonNg Je l'ai testé moi-même et l'utilisation d'un gestionnaire d'erreur de requête comme je l'ai décrit capture l'erreur, il ne devrait pas être nécessaire de déplacer la création 'Client' dans' app.post' – skirtle