尝试在快速路由中发送响应时,安全握手失败

我正在build立一个Twitter的情绪的读者,当我尝试发送一个回应的angular度,我遇到了问题。 在添加res.send()之前,一切正常,并logging了情绪。

现在我添加了res.send()函数,它将错误的数据发送回angular度。 Angular有它作为错误500和我的节点控制台有错误说POST / postUsername安全握手失败: 一些库的东西说明:TCPstream的结束“。

快速路线

 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 

angular度控制器

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

预期的输出将是“这个用户趋向正面”。

任何帮助,将不胜感激!

我看到一些问题。 首先是你正在回应,而不等待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 

所以基本上当angular度调用时,express立即发送undefinedfinalScore的值。

另一个问题是你没有真的处理错误的情况。 如果twitter客户端出现错误,则应以有意义的方式响应请求,而不是仅仅logging到控制台。 通过这种方式,您可以看到问题所在,而不是一头雾水,看看服务器控制台:

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

所以,为了解决你的问题,你需要在你的callback中作出响应,而不是在以下之后:

 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的世界。 有许多方法可以使用promise和deferred对象来清理代码,但是现在最好这样写,这样才能真正吸收javascript中asynchronous代码的工作方式。