美文网首页跟风舞烟学编程 - 大前端技术Web前端之路技术干货
项目实战(连载):基于Angular2+Mongodb+Node

项目实战(连载):基于Angular2+Mongodb+Node

作者: fwytech | 来源:发表于2017-02-11 23:06 被阅读399次

    本章主要讲什么(一句话)?

    本章主要讲解:利用mongoose第三方库进行业务数据操作

                                                      --  

    一、前言

    上一章主要对项目引入MongoDB进行数据存储,并导入mongoose第三方组件,完成mongodb数据库配置及连结代码,本节继续。

    二、技术关健词

    Node、MongoDB、Angular2、mongoose

    三、本章涉及核心技术点

    四、内容

    4.1、新建users.js组件来封装【用户】模块功能

    废话不多说,先代码奉上:

    书接上文,直接在models文件下新建一users.js文件,代码如下:


    var db = require('./mongodb');

    function User(user) {

    this.name = user.name;

    this.password = user.password;

    this.email = user.email;

    };

    module.exports = User;

    //存储用户信息

    User.prototype.save = function(callback) {

    //要存入数据库的用户文档

    var user = {

    name: this.name,

    password: this.password,

    email: this.email

    };

    //添加操作

    var userModel = new db.Users(user);

    userModel.save(function(err,user){

    if(err){

    console.err(err);

    return callback(err);//错误,返回 err 信息

    }

    console.log("sucess:"+user[0]);

    callback(null, user[0]);//成功!err 为 null,并返回存储后的用户文档

    });

    };

    //读取用户信息

    User.get = function(name, callback) {

    if (name){

    db.Users.findOne({"name":name},

    function(err,user){

    if(err) {

    console.err(err);

    return callback(err);//失败!返回 err 信息

    }

    callback(null, user);//成功!返回查询的用户信息

    });

    }else{

    db.Users.find(null,

    function(err,users){

    if(err) {

    console.err(err);

    return callback(err);//失败!返回 err 信息

    }

    callback(null, users);//成功!返回查询的用户信息

    });

    }

    };


    1. var db = require('./mongodb');

    引入上节课创建的mongodb.js文件,将来会使用其导出的类实例。

    2. function User(user) {

    this.name = user.name;

    this.password = user.password;

    this.email = user.email;

    };

    module.exports = User;

    上述代码,利用函数的方式定义了一User类,三个字段:name,password,email,并通module.exports的方式对外导出。

    3. User.prototype.save = function(callback) {

    .....

    }

    上述代码,动态的为User类定义了一静态属性,该属性实质是一个方法(function),该方法的作用是将来用于保存用户数据,注册用户时会用到,调用该方法成功后,会向Mongodb数据库的users文档中,插入一条记录,传入的参数:为一回调函数,用于执行成功或失败后的操作。

    4. var userModel = new db.Users(user);

    userModel.save(function(err,user){

    ......

    })

    上述代码,首先创建mongodb.js文件中导出来Users模型实例,然后,核心的真正调用了mongodb数据库引擎向后台插入数据的代码是:userModel.save(function(err,user){......)
    其中:save的两个参数,第一个参数err为如果插入出错,接收服务器返回的错误对象,第二个参数user为如果插入成功,返回操作成功的user用户实例集合。

    5. 需要注意的是:如果插入成功,返回的user实际是一个集合,这里由于是插入操作,这个集合里将只有一条记录,即新增的user实例,所以接收时,需要使用user[0]的方式,即:
    callback(null, user[0]);//成功!err 为 null,并返回存储后的用户文档

    6.对这个User的save方法的调用代码,将来将类似于以下这样:

    var newUser = new User({

    name: name,  //接收前台传递过来的用户名

    password: password, //接收前台传递过来的密码

    email: req.body.email  //接收前台传递过来的Email

    });

    ......

    newUser.save(function(err, user) {   //调用该User实例的save方法

    if (err) {

    res.send({ status: 'error', message: "出错了,原因如下:" + err });

    return;

    }

    res.send({ status: 'success', message: "注册成功!", user: user });

    });

    7. User.get = function(name, callback) {......})

    上述代码,动态的为User类定义了一静态属性get,该属性实质是一个方法(function),该方法的作用是用于通过用户名获取用户信息.两个参数,第一个参数name:用户名,第二个参数callback:查询成功或失败后的回调函数。

    8. 用户查找的核心数据库操作代码是:

    db.Users.findOne({"name":name},function(err,user){......})
    db.Users.find(null,function(err,users){......})
    注意findOne与find的区别,一个是查找一个单一用户(不管查到有多少条记录,均只返回第一条记录),所以回调里返回值是user,而 find查找找返回所有符合条件的,所以是个集合users

    9. 将来对User.get方法的调用的客户端代码,将类似于:

    //检查用户名是否已经存在

    User.get(newUser.name, function(err, user) {

    if (err) {

    res.send({ status: 'error', message: "出错了,原因如下:" + err });

    return;

    }

    if (user) {

    res.send({ status: 'failed', message: "用户已存在!" });

    return;

    })

    4.2、新建post.js组件来封装【博客文章】模块功能

    继续!在models文件下新建一posts.js文件,代码如下:


    var db = require('./mongodb');

    function Post(name, title, post) {

    this.name = name;

    this.title = title;

    this.post = post;

    }

    module.exports = Post;

    //存储一篇文章及其相关信息

    Post.prototype.save = function(callback) {

    var date = new Date();

    //存储各种时间格式,方便以后扩展

    var time = {

    date: date,

    year : date.getFullYear(),

    month : date.getFullYear() + "-" + (date.getMonth() + 1),

    day : date.getFullYear() + "-" + (date.getMonth() + 1) + "-" + date.getDate(),

    minute : date.getFullYear() + "-" + (date.getMonth() + 1) + "-" + date.getDate() + " " +

    date.getHours() + ":" + (date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes())

    }

    //要存入数据库的文档

    var post = {

    name: this.name,

    time: time,

    title: this.title,

    post: this.post  //文章

    };

    var postModel = new db.Posts(post);

    postModel.save(function(err){

    if(err){

    return callback(err);//错误,返回 err 信息

    }

    callback(null);//成功!

    });

    };

    //读取文章及其相关信息

    Post.get = function(name, callback) {

    var query = {};

    if (name) {

    query.name = name;

    }

    db.Posts.find(query).sort({time:-1}).find(null,function (err, docs) {

    if (err) {

    return callback(err);//失败!返回 err

    }

    callback(null, docs);//成功!以数组形式返回查询的结果

    });

    }


    1. var db = require('./mongodb');

    引入上节课创建的mongodb.js文件,将来会使用其导出的类实例。

    2. function Post(name, title, post) {

    this.name = name;

    this.title = title;

    this.post = post;

    }

    module.exports = Post;

    上述代码,利用函数的方式定义了一Post类,三个字段:name,title,post,含义与上节课定义的数据模型字段一致,并通module.exports的方式对外导出。

    3. Post.prototype.save = function(callback) {

    .....

    }

    上述代码,动态的为Post类定义了一静态属性,该属性实质是一个方法(function),该方法的作用是将来用于保存用户发表的博文内容,用户发表文章时会用到,调用该方法成功后,会向Mongodb数据库的posts文档中,插入一条记录,传入的参数callback:为一回调函数,用于执行成功或失败后的操作。

    4.  var postModel = new db.Posts(post);

    postModel.save(function(err){

    ......

    })

    上述代码,首先创建mongodb.js文件中导出来Posts模型实例,然后,核心的真正调用了mongodb数据库引擎向后台插入数据的代码是:postModel.save(function(err){......)

    其中:参数err为如果插入出错,接收服务器返回的错误对象,第二个参数省去,因为不需要。

    5. 对这个Post的save方法的调用代码,将来将类似于以下这样:

    .....

    post = new Post(currentUser.name, req.body.title, req.body.post);

    //console.log(post);

    post.save(function(err) {

    if (err) {

    res.send({ status: 'failed', message: "出错了,原因如下:" + err });

    } else {

    res.send({ status: 'successed', message: "保存成功!" });

    }

    });

    6. Post.get = function(name, callback) {......})

    上述代码,动态的为Post类定义了一静态属性get,该属性实质是一个方法(function),该方法的作用是用于通过用户名获取该用户发表的博文信息.两个参数,第一个参数name:用户名,第二个参数callback:查询成功或失败后的回调函数。

    7. var query = {};

    if (name) {

    query.name = name;

    }

    这段代码的意思是,如果从查询参数中获取到name值,则说明要获取某用户的博客列表,如果没有的话,说明要查找所有用户的博客信息

    8. db.Posts.find(query).sort({time:-1}).find(null,function (err, docs) {......})

    这段代码是核心的操作数据库查询的代码,根据query传递的值来对posts集合(表)进行查询,如果query为空({}),则说明无条件查询(即查询所有)。sort({time:-1})的意思是对查询的结果按时间倒序排列。find(null,function(err,docs){....})  ,其中的回调函数的第二参数,即用来接收从数据库中查询到符合条件的“博客文章内容”,注意:它是一个集合。

    9. 对Post.get方法调用的客户端示例代码:

    Post.get(username, function(err, posts) {

    if (err) {

    posts = [];

    }

    res.send(posts);

    });

    五、后述

    本章代码下载:http://pan.baidu.com/s/1dFmmG3B

    下章剧透:

    《项目实战:基于Angular2+Mongodb+Node技术实现的多用户博客系统教程(9)》

                                                          --  完成Node后台的用户登录模块&加入Session支持

    相关文章

      网友评论

        本文标题:项目实战(连载):基于Angular2+Mongodb+Node

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