在现有应用程序上实现socket.io

时间:2015-07-09 03:29:42

标签: angularjs node.js express socket.io

我当前的应用程序轮询使用MEAN堆栈并在控制器中我有一个函数vote()和API路由定义如下:

" / API /轮询/ pollID / pollChoiceID"

(例如http://localhost:3001/api/polls/5587ad060a9e110816f9f1a8/5587ad060a9e110816f9f1a9

我的应用程序运行正常,但现在我正在寻求在此应用上实现socket.io,以便当客户端#2连接并投票时,客户端#1的投票结果图将更新实时。我做了一些关于socket.io的研究,但我还是坚持实现它。

例如,在controller.js和vote()内部,我需要添加:

socket.emit('发送:投票',民意调查);

并且在routes / index.js上我需要处理来自控制器的socket.emit,所以我用socket.on包装现有的router.post代码:

socket.on('send:vote', function(data){
    router.post('/api/polls/:poll_id2/:poll_choice2', function(req, res)
        {
            //existing code here
        }
}

但是,我不确定我是否采取了正确的步骤,以便他们能够使用我现有的API路线。任何输入都会很棒!感谢

/*
  controller.js
*/
var voteObj = { poll_id1: pollSelected, choice1: pollChoiceSelected };
$scope.votedPollID = voteObj.poll_id1;
$scope.votedPollChoiceID = voteObj.choice1;

$scope.vote = function()
{
   $http.post('/api/polls/' + $scope.votedPollID + '/' + $scope.votedPollChoiceID)
            .success(function (data) 
            {
                console.log(data);
                $scope.poll = data;
            })
            .error(function(data) {
                console.log('Error: ' + data);
            })
/*
 routes/index.js
*/
router.post('/api/polls/:poll_id2/:poll_choice2', function(req, res)
        {
                var testpollid = req.params.poll_id2;

                var testpollchoiceid = req.params.poll_choice2;

                var ipCounter = 0;

                PollModel.findById({_id: req.params.poll_id2}, function(err, poll)
                {
                    if(poll)
                    {
                        var choice = poll.choices.id(testpollchoiceid);

                        choice.votes.push({ ip: ip });

                        var ipCounter = ipCounter++;

                        poll.save(function(err, doc)
                        {
                            if(err)
                            {
                                return (err);
                            }
                            else 
                            {
                                var theDoc = {
                                    question: doc.question, id: doc._id, choices: doc.choices,
                                    userVoted: false, totalVotes: 0
                                };
                                for(var i = 0, ln = doc.choices.length; i< ln; i++)
                                {
                                    var choice = doc.choices[i];

                                    for(var j= 0, jLn = choice.votes.length; j< jLn; j++)
                                    {
                                        var vote = choice.votes[j];
                                        theDoc.totalVotes++;

                                        theDoc.ip = ip;

                                        if(vote.ip === ip)
                                        {
                                            theDoc.userVoted = true;
                                            theDoc.userChoice = { _id: choice._id, text: choice.text };
                                        }
                                    }
                                }
                                poll.userVoted = theDoc.userVoted;
                            }                       
                        });     
                            return res.json(poll);
                    }
                    else 
                    {
                        return res.json({error:true});
                    }
                });
        });
    });
});

0 个答案:

没有答案