尝试在快速路由中发送响应时,安全握手失败
我正在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立即发送undefined
的finalScore
的值。
另一个问题是你没有真的处理错误的情况。 如果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代码的工作方式。