專案實戰(連載):基於Angular2+Mongodb+Node技術實
本章主要講什麼(一句話)?
本章主要講解:利用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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 基於webpack4.x專案實戰Web
- WEB實戰:使用MERN技術棧開發專案Web
- 技術實戰:初創專案前端框架選型前端框架
- 基於 CNN 的驗證碼破解實戰專案CNN
- Knative 實戰:基於 Knative Serverless 技術實現天氣服務-下篇Server
- 精通 Python 網路爬蟲:核心技術、框架與專案實戰Python爬蟲框架
- NetCore專案實戰篇08---Docker掛載mysql並連線.netCoreWebNetCoreDockerMySqlWeb
- 前端技術分享:Nginx負載均衡影片,基礎的實戰應用前端Nginx負載
- 前端技術演進(六):前端專案與技術實踐前端
- 技術解讀 | 基於fastText和RNN的語義消歧實戰ASTRNN
- dubbo專案實戰
- HarmonyOS 實戰專案
- LittleFox專案實戰
- python實戰專案Python
- 爬蟲技術實戰爬蟲
- 基於webpack4.x專案實戰3 - 手寫一個cliWeb
- 實戰專案-基於K8s平臺進行wordpress建站K8S
- 基於webpack4.x專案實戰2 - 配置一次,多個專案執行Web
- Flutter實戰 | 從 0 搭建「GitHub」APP(一、專案簡介、技術選型)FlutterGithubAPP
- 微服務架構大型電商專案開發流程及技術實戰微服務架構
- 實戰react技術棧+express前後端部落格專案(1)– 整體專案結構搭建ReactExpress後端
- TypeScript + 大型專案實戰TypeScript
- AMP專案實戰分享
- TF專案實戰(基於SSD目標檢測)——人臉檢測1
- Flutter核心技術與實戰Flutter
- 《ASP.Net Core技術內幕與專案實戰》讀書筆記_1ASP.NET筆記
- 優效學院 基於微服務的秒殺專案實戰 Spring Boot 2.0基礎微服務Spring Boot
- 專案實戰之gradle在實際專案中的使用Gradle
- # 計算機軟體技術實習日誌專案三(二) 迷宮專案實現計算機
- 【主流技術】ElasticSearch 在 Spring 專案中的實踐ElasticsearchSpring
- Go語言專案實戰:基於開源資料的成語查詢Go
- 基於Ethereum & IPFS的去中心化Ebay區塊鏈專案開發實戰中心化區塊鏈
- 基於 abp vNext 和 .NET Core 開發部落格專案 - Blazor 實戰系列(八)Blazor
- 基於 abp vNext 和 .NET Core 開發部落格專案 - Blazor 實戰系列(七)Blazor
- 基於 abp vNext 和 .NET Core 開發部落格專案 - Blazor 實戰系列(三)Blazor
- 基於 abp vNext 和 .NET Core 開發部落格專案 - Blazor 實戰系列(二)Blazor
- 基於 abp vNext 和 .NET Core 開發部落格專案 - Blazor 實戰系列(九)Blazor
- 基於 abp vNext 和 .NET Core 開發部落格專案 - Blazor 實戰系列(一)Blazor