本章主要讲什么(一句话)?
本章主要讲解:利用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