2016-12-12 16 views
2

私はtwitterの感情リーダーを構築しています。 res.send()を追加する前にすべてうまくいき、その感情を記録しました。高速ルートで応答を送信しようとしたときにセキュリティハンドシェイクが失敗しました

これで、res.send()関数を追加しました。これは、データをangleに戻すときにエラーになります。角度は、エラー500としてそれを持って、私のノードのコンソールには、POST/postUsernameセキュリティハンドシェークが失敗しましたというエラーがあります。いくつかのライブラリのものを説明:TCPストリームの終わりを」

エクスプレスルート

router.post("/postUsername", function(req, res){ 
    console.log(req.body.userName); 
    var client = new Twitter({ 
    consumer_key: '', 
    consumer_secret: '', 
    access_token_key: '', 
    access_token_secret: '' 
    });// client 
    client.get('statuses/user_timeline', {screen_name: req.body.userName, count:20}, function(error, tweets, response) { 
    tweet = analyzeIt.seperateData(tweets); 
    var document = language.document(tweet); 
    if (!error) { 
     var parsedScore; 
     var parsedMagnitude; 
     var finalScore; 
     var options = { 
     verbose: true 
     }; // options 
     document.detectSentiment(options, function(err, score) { 
     if (err) { 
      console.log(err); 
     } //if err 
      parsedScore = score.score; 
      parsedMagnitude = score.magnitude; 
      finalScore = analyzeIt.finalScore(parsedScore, parsedMagnitude); 
      console.log(finalScore); 
     });//detect sentiment 
     }//if not error 
    });//client get statuses 
    res.send(finalScore); 
    });//router post 

角度コントローラ

app.controller('myController', function($scope, $http){ 

    $scope.sendData = function() { 
    var data = { userName: $scope.userName }; 
    console.log($scope.userName); 
    $http.post('/postUsername', data) 
    .success(function (data, status, headers, config) { 
     $scope.PostDataResponse = data; 
    }) 
    .error(function (data, status, header, config) { 
     $scope.PostDataResponse = "Data: " + status; 
    }); 
    }; 
}); 

期待される出力は次のようなものになるだろう "ポジティブこのユーザーの動向。"

何か助けていただければ幸いです!

+0

'client.get'が応答する前にあなたの応答を送信しているようです。 'res.send(finalScore)'は 'client.get'コールバックの内部で呼び出されるべきではありませんか? 'detectSentiment'についても同じことが起こります。あなたはコールバックの外側で 'finalScore'にアクセスしようとしています –

答えて

2

いくつかの問題があります。まず、Twitterのリクエストが完了するのを待つことなく、すぐに応答していることです。コールは、角から作られたとき

// Call order: #1 
client.get(..., function(error, tweets, response) { 
    // Call order: #3 
    // anything in here no longer matters 
}); 
// Call order: #2 
res.send(finalScore) //because this executes before the code in the callback above 

だから、本質的に、すぐにundefinedあるfinalScoreの値を送り返す表現します。

もう1つの問題は、実際にエラーの場合を渡していないことです。ツイッタークライアントにエラーがある場合は、単にコンソールにロギングするのではなく、意味のある方法でリクエストに応答する必要があります。あなたが見ることができるこの方法は、角度内の問題ではなく、あなたの頭に傷を付け、サーバーのコンソールを見る必要のあるもの:

if(!error) { 
    //do normal stuff 
} 
else { 
    res.status(500).send("Twitter error: " + error); 
} 

同じことがdetectSentimentのために行く:

だから、
document.detectSentiment(options, function(err, score) { 
    if (err) { 
     console.log(err); 
     res.status(500).send("Error detecting sentiment: " +err); 
    } 
}); 

、あなたの問題を解決するために問題は、あなたがあなたのコールバック内で応答する必要が、後ではない:

router.post("/postUsername", function(req, res){ 
    ... 
    client.get('statuses/user_timeline', {screen_name: req.body.userName, count:20}, function(error, tweets, response) { 
    ... 
    if (!error) { 
     ... 
     document.detectSentiment(options, function(err, score) { 
     if (err) { 
      console.log(err); 
      res.status(500).send("Error detecting sentiment: " + err); 
     } //if err 
      ... 
      console.log(finalScore); 
      res.send(finalScore); 
     });//detect sentiment 
    } 
    else { 
     res.status(500).send("Twitter error: " + error); 
    } 
    });//client get statuses 
});//router post 

あなたの応答はとても深い巣に持っていることを、最初に、少し奇妙なようだが、それがすべてではありません。これはjavascriptの世界です。コードをクリーンアップするために約束や遅延オブジェクトを使用する方法がありますが、今のところ、このように書くと、JavaScriptの非同期コードが実際にどのように機能するのかが分かりやすくなります。

+0

これを解決する最良の方法は何でしょうか? – Quesofat

関連する問題