專案實戰(連載):基於Angular2+Mongodb+Node技術實

fondtiger發表於2021-09-09

本章主要講什麼(一句話)?

本章主要講解:利用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()

}

//要存入資料庫的文件

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);

});

五、後述

本章程式碼下載:

下章劇透:

《專案實戰:基於Angular2+Mongodb+Node技術實現的多使用者部落格系統教程(9)》

                                                      --  完成Node後臺的使用者登入模組&加入Session支援

作者:fwytech

連結:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2508/viewspace-2813568/,如需轉載,請註明出處,否則將追究法律責任。

相關文章