上一篇安裝的 Compass 工具真的很好玩,後來我又自己玩了一下xD
不過很可惜今天用不到它了~
今天進度目標是要把後端API連線資料庫,做真實資料的判斷!!
今天的建置環境是安裝驅動,Nodejs必須透過驅動才能對MongoDB做連線
順帶一提,無論什麼DB都是需要裝驅動才有辦法連線,包含MySQL、Oracle等等
輸入安裝指令:
npm install mongodb
安裝完成後,開啟 /modules/users.module.js 引用 mongodb
套件
const MongoClient = require('mongodb').MongoClient;
準備連線資料庫的連線字串
MongoDB的連線字串格式為: mongodb://HOST:PORT
HOST
: 伺服端的HOST值PORT
: 伺服端的PORT值而這些設定並不會全部放在module檔上,日後維護會不方便
所以我通常會建立一個 /config 資料夾,內容放這些設定檔,再到module引用它,結構會是:
└── config
└── index.js
index.js
檔案內容就放這樣:
const mongodb = {
HOST: 'localhost',
PORT: 27017,
DATABASE: 'Ironman12'
};
module.exports = {
mongodb
};
回到 /modules/users.module.js 引用設定檔:
const config = require('../config');
再利用設定檔組合出連線字串:
const mongoDBConnectionUrl = `mongodb://${config.mongodb.HOST}:${config.mongodb.PORT}`;
雖然看起來是多做了很多工,但日後維護時,就可以馬上知道要去config找DB設定,而不是一行一行查程式碼
另一個好處是,假設今天做的是一個大專案,裡面有一堆module,每一個module都有連線到相同的資料庫,而原本放資料庫的伺服器好死不死突然掛掉了,這時候所有連線要改成另一台伺服器,這時候就不用去每個module改,只要改config就好
以上情境是有藏怨念的...
環境建置完成後就可以實際操作對DB存取囉~
建立連線:
MongoClient.connect(mongoDBConnectionUrl, {
useUnifiedTopology: true
}).then((client) => {
// dosomething...
}).catch(error => {
reject({ message: error });
});
建立連線失敗時,直接 reject
掉,然後把錯誤訊息回傳
註: useUnifiedTopology 這項設定,目前估狗到的相關解釋都有點難理解,什麼拓樸之類的...
請大神開示QQ
連線成功時,設定要存取的DB:
const dbIronMan12 = client.db(`${config.mongodb.DATABASE}`);
建立對Collection存取的連線:
dbIronMan12.collection("users", function (error, collection) {
if (error) {
reject({ message: error });
} else {
// dosomething...
}
});
一樣連線失敗時 reject
掉~
下條件抓取對應的帳號資料,collection方法可參考Collection Methods
這裡用的是 findOne()
方法來取得對應的 accountId 內容,有抓到內容會回傳物件,沒有的話回傳 null
collection.findOne({ accountId: values.accountId }).then((user) => {
//user=回傳的結果,有內容則往下判斷,沒有內容就reject
if (user) {
// dosomething...
} else {
reject({ message: '無此帳號' });
}
client.close();
});
有抓到內容的話,要來判斷密碼是否正確:
if (user.password === values.password) {
resolve({ message: '登入成功' });
} else {
reject({ message: '密碼錯誤' });
}
到這邊就完成進度目標囉!!
完整的 users.module.js
代碼長這樣:
const e = require("express");
const MongoClient = require('mongodb').MongoClient;
const config = require('../config');
const mongoDBConnectionUrl = `mongodb://${config.mongodb.HOST}:${config.mongodb.PORT}`;
const userModuleSignin = (values) => {
return new Promise((resolve, reject) => {
MongoClient.connect(mongoDBConnectionUrl, {
useUnifiedTopology: true
}).then((client) => {
client.db(`${config.mongodb.DATABASE}`).collection("users", (error, collection) => {
if (error) {
reject({ message: error });
} else {
collection.findOne({ accountId: values.accountId }).then((user) => {
if (user) {
if (user.password === values.password) {
resolve({ message: '登入成功' });
} else {
reject({ message: '密碼錯誤' });
}
} else {
reject({ message: '無此帳號' });
}
client.close();
});
}
});
}).catch(error => {
reject({ message: error });
});
});
};
module.exports = {
userModuleSignin
};
用POSTMAN測試的畫面
今日重點:
mongodb://HOST:PORT
今天成功完成了第一支API
並且達到鐵人賽完成一半的里程碑了
(雖然第9天就中斷了QQ)
有需要改進或是任何意見建議歡迎下面留言~