项目源自慕课网Scott老师,https://www.imooc.com/learn/75
最近在学习node.js,我花了一天时间实现了慕课网Scott老师的项目,但看课程评论有很多同学吐槽使用的插件太多,或是mongoose不大会使用等等,于是写了这篇心得,希望可以帮助大家
1、版本和安装依赖
注意express4.x的变化,很多之前内置的中间件需要单独引入,具体请看官网:http://www.expressjs.com.cn/guide/migrating-4.html
如body-parser等
2、视图
项目共有4个页面
视图使用ejs模板引擎渲染(原谅我实在不喜欢jade的缩进写法--!),所以需要引入ejs包,前面依赖项已经说了,而且注意目录中layout.ejs作为母板文件,需要引入partials(也是版本原因,当前的express版本貌似不支持ejs公用layout了)
这时候我们就可以像使用视频中layout.jade一样使用ejs语法来创建视图的公共部分了
3、静态资源
说一下静态资源的配置吧,这里引入node内置模块path,使用‘__dirname+’的方式保证资源路径的准确性,同样由于express4.x版本原因,var resource =require('serve-static');引入设置静态资源的中间件
此时,我们看layout.ejs文件
注意看,静态资源位置已经指定为bower安装包‘bower_components’,我在项目中引入静态资源文件时,路径默认为‘bower_components’下,这里路径前面的'/'表示定位到项目根目录下,后面我们会看到,如果存在二级路由,比如admin/movie,若不要前面的‘/’,那么会从根目录/movie/bower_components下寻找资源,自然是无法找到的。
(../上一级目录,./当前目录,/根目录)
4、ejs语法
这里简单说一下ejs的语法吧:
1、<% code %>:在html中插入js语法。稍微注意一下for循环的写法(两行分别包围起来)
2、<%= 数据%>:赋值写法,上图中也有
3、<%- body%>:我们的layout文件中表示其他ejs文件都引入这里(包含及引入)
更多请看ejs相关文档,总体来说ejs还是挺简单的
5、mongoDB
关于mongoDB的安装这里不再赘述,这里有详细说明http://www.runoob.com/mongodb/mongodb-tutorial.html
我们使用mongoose来操作mongoDB,首先连接数据库
mongoose.connect('mongodb://localhost:27017/movies');movies是我们此项目中需要使用的collection,可以在命令行下添加一些测试数据;
mongoose的核心是Schema、Model和documents。我们先明确几个概念,documents是最终数据库中的数据,Model是构建我们所需要的数据的构造函数,可以构建我们需要的数据,同时也具有向数据库增删改查的方法,Schema定义数据模型。
常规步骤如下:
先定义数据模型Schema
var movieSchema = mongoose.Schema({ name: String, doctor: String, title: String, poster: String, language: String, country: String, brief: String, flash: String, year: Number, meta: { createAt: { type: Date, default: Date.now() }, updateAt: { type: Date, default: Date.now() } } });
Schema上有一些API,比如视频中的
相当于给这种类型的所有数据实例化对象都添加了一个叫findId的方法,movieSchema.static('findId',function (id) { return this.findOne({_id:id},function (err,doc) { console.log(doc); }) });
另外也可以给模型添加中间件pre(mongoose一共两种类型的中间件,pre和post,
movieSchema.pre('save', function (next) { if (this.isNew) { this.meta.createAt = Date.now() } else { this.meta.updateAt = Date.now() } next(); });中间件是node.js的重要概念,不理解的话可以查阅相关资料 之后导出构造这种类型数据的构造函数Model
var Movie = mongoose.model('Movie',movieSchema); module.exports = Movie;最后我们就可以愉快的使用mongoose的增删查改功能了,比如:
app.get('/', function (req, res) { var movies = []; Movie.find({},function (err,doc) { if (err) res.end(err); movies = doc; res.render('pages/index', {title: '我是首页',movies:movies}); }); });
在app.js中,我们先require到Movie,此时的Movie是一个Model构造函数,可以构建数据,也有增删改查的方法,我们使用Movie.find(),顾名思义,查询数据,传入一个空对象表示查询所有,查询完成后执行回调,回调的第一个参数国际惯例错误参数,第二个参数即为我们查询到的结果,我们直接响应将查询到的所有数据返回首页进行操作;
再来实现一个post功能:
app.post('/admin/movie/new',urlEncoder,function (req,res) { var movie = Movie(req.body); movie.save(function (err) { if (err) res.end('fail'); res.redirect('/'); }); });注意这里的urlEncoder,还记得我们最开始说由于版本问题,4.x中大部分中间件都需要重新引入
var bodyParser = require('body-parser'); var urlEncoder = bodyParser.urlencoded({extended:false});
这个urlEncoder就是就是解析请求体的中间件,将req请求体解析为js对象,这样我们就可以直接使用Movie(req.body)构造一条我们post上来的数据,然后调用Model的save方法,将数据保存到数据库中了
到这里,我们已经实现了增加数据和获取数据的功能,另外修改和删除的功能在过程上与之大同小异,这里就不再赘述了,大家参考Scott老师的视频自己实现一下吧~