目的
了解node的特点和运行
从实战的角度去看待nodejs
完成node 基本的增删改查
所用到的技术点
后台:
node
express插件
前端使用的是
jade模版引擎
bower 包管理工具
数据库:
mongodb
效果图
首页列表页
详情页:
录入页
后台列表页
首先启动node服务,引入express 创建四个页面的实例
var express =require('express') //引入express
var bodyParser = require('body-parser')
//bodyParser中间件用来解析http请求体,是express默认使用的中间件之一
var port = process.env.PORT || 3000 //端口
var path = require('path') // 路径
var app = express() //创建app实例
app.set('views','./views/pages') //设置默认的视图入口
app.set('view engine', 'jade') ////设置默认的模板引擎
pp.use(bodyParser.urlencoded({ extended: true })) //表单数据格式化
app.use(bodyParser.json())
app.use(express.static(path.join(__dirname,'public')))//利用express托管静态文件
app.listen(port);//监听端口
app.get('/',function(req,res){
res.render('index',{ //我们渲染的模版引擎是index 然后我们的数据有title 和 movies movies 是一个数组,里面的数据将会再jade的模版下遍历
title:'首页',
movies:[{
title:'海贼王1',
_id:1,
poster:'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1498073820097&di=ffa8654f9395f94ac5041fe67b6f2d2e&imgtype=0&src=https%3A%2F%2Fsiteproxy.ruqli.workers.dev%3A443%2Fhttp%2Fcdn0.hbimg.cn%2Fstore%2Fsnsthumbs%2F650_2000%2Falbum%2F200816%2F8A74DEBFEDAD9BB183FFCBC649AC81FBCA8428F0FF.jpg'
},{
title:'海贼王2',
_id:2,
poster:'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1498073820097&di=ffa8654f9395f94ac5041fe67b6f2d2e&imgtype=0&src=https%3A%2F%2Fsiteproxy.ruqli.workers.dev%3A443%2Fhttp%2Fcdn0.hbimg.cn%2Fstore%2Fsnsthumbs%2F650_2000%2Falbum%2F200816%2F8A74DEBFEDAD9BB183FFCBC649AC81FBCA8428F0FF.jpg'
},{
title:'海贼王3',
_id:3,
poster:'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1498073820097&di=ffa8654f9395f94ac5041fe67b6f2d2e&imgtype=0&src=https%3A%2F%2Fsiteproxy.ruqli.workers.dev%3A443%2Fhttp%2Fcdn0.hbimg.cn%2Fstore%2Fsnsthumbs%2F650_2000%2Falbum%2F200816%2F8A74DEBFEDAD9BB183FFCBC649AC81FBCA8428F0FF.jpg'
},{
title:'海贼王4',
_id:4,
poster:'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1498073820097&di=ffa8654f9395f94ac5041fe67b6f2d2e&imgtype=0&src=https%3A%2F%2Fsiteproxy.ruqli.workers.dev%3A443%2Fhttp%2Fcdn0.hbimg.cn%2Fstore%2Fsnsthumbs%2F650_2000%2Falbum%2F200816%2F8A74DEBFEDAD9BB183FFCBC649AC81FBCA8428F0FF.jpg'
},{
title:'海贼王5',
_id:5,
poster:'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1498073820097&di=ffa8654f9395f94ac5041fe67b6f2d2e&imgtype=0&src=https%3A%2F%2Fsiteproxy.ruqli.workers.dev%3A443%2Fhttp%2Fcdn0.hbimg.cn%2Fstore%2Fsnsthumbs%2F650_2000%2Falbum%2F200816%2F8A74DEBFEDAD9BB183FFCBC649AC81FBCA8428F0FF.jpg'
},{
title:'海贼王6',
_id:6,
poster:'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1498073820097&di=ffa8654f9395f94ac5041fe67b6f2d2e&imgtype=0&src=https%3A%2F%2Fsiteproxy.ruqli.workers.dev%3A443%2Fhttp%2Fcdn0.hbimg.cn%2Fstore%2Fsnsthumbs%2F650_2000%2Falbum%2F200816%2F8A74DEBFEDAD9BB183FFCBC649AC81FBCA8428F0FF.jpg'
}]
})
})
我们再来看jade下index的模版是怎么写的
extends ../layout //继承 layout.jade 里的东西
block content
.container
.row
each item in movies //遍历出来上面数组的内容 想 vue 里面的 v-for tp 里面的 volist
.col-md-2
.thumbnail
a(href="movie/#{item._id}")
img(src="#{item.poster}",alt="#{item.title}")
.caption
h3 #{item.title}
p: a.btn.btn-primary(href="/movie/#{item._id}",role="button") 观看预告片
其他的页面类似
那么问题来了 我们怎样从数据库里面获取数据呢
这就需要我们链接上 mongodb
首先在app.js里面 连接上mongodb
var mongoose =require('mongoose')
mongoose.Promise = global.Promise;
mongoose.connect('mongodb://localhost:27017/nodetest');
mongoose.connection.on('connected', function(){
console.log('Connection success!');
});
然后呢 我们需要 了解一些概念
Schema ModelSchema是一个文档的数据结构,正如我前面提到的,它在Mongoose是一个JSON对象。它最大的特点就是无需确定字段的大小,这特别适用于需要改变对象大小的情况,它支持8种数据类型(String、Number、Date、Boolean和Buffer、ObjectId、Mixed、ObjectId、Mixed、Array)。Buffer是用来存储2进制数据,ObjectId是不同于_id的特定的识别符。Mixed可以指定任意类型,不过Mongoose不会自动识别。Array用来存放基本数据类型,也可以是子文档
Model是对应Schema的编译版本,一个model的实例直接映射为数据库中的一个文档。基于这种关系,model处理所有的文档交互)。我们通过 mongoose.model(modelname, schemaName) 来构建model。这样一来我们就可以一鼓作气地将数据存入数据了
var mongoose = require('mongoose') //引入mongoose
var MovieSchema = new mongoose.Schema({ //new 一个新的 model
doctor:String,
title:String,
language:String,
country:String,
summary:String,
flash:String,
poster:String,
year:Number,
meta:{
createAt:{
type:Date,
default:Date.now()
},
updateAt:{
type:Date,
default: Date.now()
}
}
})
MovieSchema.pre('save',function(next){ //模型的save方法 每次保存的时候都要执行这个方法 相当中间件
if (this.isNew) {
this.meta.createAt = this.meta.updateAt = Date.now()
}
else{
this.updateAt = Date.now()
}
next()
})
给模式MovieSchema添加静态方法
fetch查询所有数据。findById查询单条数据
MovieSchema.statics = {
fetch:function(cb){
return this
.find({})
.sort('meta.updateAt')
.exec(cb)
},
findById:function(id,cb){
return this
.findOne({_id:id})
.exec(cb)
}
}
module.exports = MovieSchema //为mongodb定义了这个数据模型Movie , 这个数据模型和当前的数据库绑定了;
我们再来看
var mongoose = require('mongoose')
var MovieSchma =require('../schemas/movie') //引入了上面的 文件 然后呢相当于 var MovieSchma =MovieSchema
var movie =mongoose.model('movice',MovieSchma) //对movice 使用这个模型
module.exports = movie
app.js里面添加
var Movie=require('./models/movie')//加载movie
然后我们改写
app.get('/',function(req,res){
Movie.fetch(function(err,movies) { //查出 movies 表的信息
if (err) {
console.log(err);
}
res.render('index',{
title:'首页',
movies:movies //然后吧返回的 movies数据 赋值给
})
})
})
我们就从数据库里面取出了数据
其他的页面都是采用这种方式进行的操作。