Express+mongoDB开发简单后台管理系统心得(慕课)

项目源自慕课网Scott老师,https://www.imooc.com/learn/75

最近在学习node.js,我花了一天时间实现了慕课网Scott老师的项目,但看课程评论有很多同学吐槽使用的插件太多,或是mongoose不大会使用等等,于是写了这篇心得,希望可以帮助大家

1、版本和安装依赖

Express+mongoDB开发简单后台管理系统心得(慕课)

Express+mongoDB开发简单后台管理系统心得(慕课)

注意express4.x的变化,很多之前内置的中间件需要单独引入,具体请看官网:http://www.expressjs.com.cn/guide/migrating-4.html

如body-parser等

2、视图

项目共有4个页面

Express+mongoDB开发简单后台管理系统心得(慕课)

视图使用ejs模板引擎渲染(原谅我实在不喜欢jade的缩进写法--!),所以需要引入ejs包,前面依赖项已经说了,而且注意目录中layout.ejs作为母板文件,需要引入partials(也是版本原因,当前的express版本貌似不支持ejs公用layout了)

Express+mongoDB开发简单后台管理系统心得(慕课)Express+mongoDB开发简单后台管理系统心得(慕课)

这时候我们就可以像使用视频中layout.jade一样使用ejs语法来创建视图的公共部分了

3、静态资源

说一下静态资源的配置吧,这里引入node内置模块path,使用‘__dirname+’的方式保证资源路径的准确性,同样由于express4.x版本原因,var resource =require('serve-static');引入设置静态资源的中间件

Express+mongoDB开发简单后台管理系统心得(慕课)

此时,我们看layout.ejs文件

Express+mongoDB开发简单后台管理系统心得(慕课)

注意看,静态资源位置已经指定为bower安装包‘bower_components’,我在项目中引入静态资源文件时,路径默认为‘bower_components’下,这里路径前面的'/'表示定位到项目根目录下,后面我们会看到,如果存在二级路由,比如admin/movie,若不要前面的‘/’,那么会从根目录/movie/bower_components下寻找资源,自然是无法找到的。

(../上一级目录,./当前目录,/根目录)

4、ejs语法

这里简单说一下ejs的语法吧:

1、<% code %>:在html中插入js语法。稍微注意一下for循环的写法(两行分别包围起来)

Express+mongoDB开发简单后台管理系统心得(慕课)

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,比如视频中的


movieSchema.static('findId',function (id) {
    return this.findOne({_id:id},function (err,doc) {
        console.log(doc);
    })
});
相当于给这种类型的所有数据实例化对象都添加了一个叫findId的方法,

另外也可以给模型添加中间件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老师的视频自己实现一下吧~