美文网首页Node
Express+Socket.io实时投票系统(一)

Express+Socket.io实时投票系统(一)

作者: kangkangz4 | 来源:发表于2016-10-27 16:37 被阅读249次

    通过实现一个Express和Socket.io的实时投票系统来学习Express和Socket.io的用法。

    以下实现参考:http://www.ibm.com/developerworks/cn/web/wa-nodejs-polling-app/

    构建该应用程序的先决条件:
    1.基本了解 Node.js 和 Node.js 开发环境
    2.具有以下这些 Node.js 模块:Express frameworkJadeMongoosesocket.io
    3.AngularJS JavaScript 框架
    4.MongoDB NoSQL 数据库

    首先通过express-generator来创建一个新的工程

    //安装
    npm install -g express-generator
    //创建工程并进入工程包
    express poll && cd poll
    //安装依赖包
    npm install
    

    装完以后,应该就是一个express工程了
    我们可以直接运行一下

    npm start
    

    访问
    http://localhost:3000
    就能看到Express生成的网站了。

    安装mongoose

    //安装mongodb依赖
    npm install mongodb --save
    //安装mongoose依赖
    npm install mongoose --save
    

    安装后,在poll工程下创建一个models文件夹,在这个文件夹下创建一个polls.js,这个文件定义了我们投票信息的结构

    'use strict'
    
    var mongoose = require('mongoose');
    var Schema = mongoose.Schema;
    //投票IP
    var voteSchema = new Schema({
        ip: String
    });
    //选项
    var choiceSchema = new Schema({
        text: String,
        votes: [voteSchema]
    });
    //投票详细信息
    var pollSchema = new Schema({
        question: {
            type: String,
            required: true
        },
        choices: [choiceSchema],
        createdAt: {
            type : Date, 
            default: new Date()
        },
        updatedAt: {
            type: Date,
            default: new Date()
        }
    });
    
    module.exports = pollSchema;
    

    结构定义好之后,我们就可以写对应的增删改查了
    在routes/index.js中加入

    var mongoose = require('mongoose');
    mongoose.connect('mongodb://localhost/demo2');
    
    var pollSchema = require('../models/polls');
    var Poll = mongoose.model('Poll', pollSchema);
    
    /* GET home page. */
    router.get('/', function(req, res, next) {
      res.render('index', { title: '投票' });
    });
    
    //投票列表
    router.get('/polls', function(req, res, next){
        Poll.find({}, 'question', function(error, polls){
            res.json(polls);
        })
    });
    
    //取得单一投票信息
    router.get('/poll/:id', function(req, res, next){
        var pollId = req.params.id;
    
        Poll.findById(pollId, '', {lean: true}, function(error, poll){
            //查询单条投票信息
            if(poll){
                var userVoted = false,
                    userChoice,
                    totalVotes = 0;
                poll.choices.forEach(function(choice, index) {
                    choice.votes.forEach(function(vote, index) {
                        totalVotes++;
                        if(vote.ip === (req.header('x-forwarded-for') || req.ip)){
                            userVoted = true;
                            userChoice = { _id: choice.id, text: choice.text };
                        }
                    });
                });
                poll.userVoted = userVoted;
                poll.userChoice = userChoice;
                poll.totalVotes = totalVotes;
                res.json(poll);
            }else{
                res.json({error: true});
            }
        });
    
    });
    
    //创建投票
    router.post('/pollAdd', function(req, res, next){
        var reqBody = req.body;
        var choices = reqBody.choices.filter(function(v){
            return v.text != "";
        });
        var pollObj = {
            question: reqBody.question,
            choices: choices
        }
        var poll = new Poll(pollObj);
        poll.save(function(error, doc){
            if(error || !doc){
                res.send(error);
            }else{
                res.json(doc);
            }
        })
    });
    

    这里定义了两个Get方法,一个Post方法,两个Get方法主要是获取数据,一个是获取列表,一个是获取单一投票信息的方法,这里Restful接口就定义好了
    现在运行一下

    npm start
    

    你可以用一些Post工具,直接插入数据,个人比较喜欢用Postman
    这里可以往http://localhost:3000/pollAdd发送Post请求

    {
        "question": "question1",
        "choices": [{ "text": "choices1"}, { "text": "choices2"}, { "text": "choices3"}]
    }
    
    屏幕快照 2016-10-27 下午4.34.12.png

    如果没有报错的话,数据就插入mongodb数据库了。
    好了,第一节结束了。休息一下,下面第二节的话,会介绍Angular的安装

    相关文章

      网友评论

      • 任之_f767:安装mongoose出错:
        sudo npm ERR! Unexpected end of input at 1:10970
        npm ERR! egexp-clone":"0.0.1"},"devDependencies":{"mongodb":"1.3.23","mocha":"
        npm ERR! ^

        npm ERR! A complete log of this run can be found in:
        npm ERR! /Users/caiwenhong/.npm/_logs/2017-09

      本文标题:Express+Socket.io实时投票系统(一)

      本文链接:https://www.haomeiwen.com/subject/krcsuttx.html