手记

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

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

本章主要讲解:利用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支持

作者:fwytech

链接:https://www.jianshu.com/p/557d1b3eb506


0人推荐
随时随地看视频
慕课网APP