通过实现一个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 framework、Jade、Mongoose 和 socket.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的安装
网友评论
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