2017-10-21 27 views
0

node-rest-clientを使用してノードからREST APIを呼び出そうとしています。私の呼び出しがエラーを返す場合は、エラーをキャッチして呼び出し元に報告したいと思います。node-rest-client:ヘッダーが送信された後にヘッダーを設定できません。

私はPostmanでこれを試していますが、残念ながらこれは一度しか動作しません。 2回目にsendを押すと、node.jsプログラムが "送信後にヘッダーを設定できません"というエラーでクラッシュします。

私はnode.jsで新しくなっています。

//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

を参照してください。それ以降は、「送信後にヘッダーを設定できません」というエラーメッセージが表示されます。 –

答えて

1

あなたはこの持っている:このclient上のエラーハンドラを登録しますが、それは削除されることは決してありません

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

を。 clientは要求間で共有されるため、後続の要求でエラーが発生しても古いエラーハンドラは起動されます。

代わりに、リクエストでエラーを聞くことができます。このような何か:

var request = client.post("... 

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

プログラムは、「必要な詳細情報を記入してください」の部分で問題がないhttps://www.npmjs.com/package/node-rest-client#error-handling

+0

試してみましたが、クライアントのみです。 ( "エラー ")に..エラーをキャッチ events.js:165 スローERR; ^エラー:キャッチされない、不特定の "エラー"。。イベント(エラー解析応答応答:[{" タイプ」 : "悪い要求"、 "コード": "400" .... –

+0

私はそれをapp.post内でvar client = new Client();を使って解決しました。 –

+1

@JacksonNg私は自分でテストしましたが、私が説明したようにリクエストエラーハンドラを使ってエラーをキャッチします。 'app.post'の中で' Client'の作成を移動する必要はありません。 – skirtle

関連する問題