Express 要與 MongoDB 溝通的方式有好幾種,其中最知名的就是 mongoose 這個套件了,它是一個 ODM 套件,採用 schema-based,讓我們能用較簡單的方式來存取 MongoDB。
一樣透過 npm 進行安裝:
npm install mongoose
安裝 type 定義檔:
npm install @types/mongoose --save-dev
在
mongoose
6 版以後不需要額外安裝 type 定義檔,感謝熱心的 gogo.afuzzz 補充。
我們可以透過 mongoose 的方法進行連線,新增一個 database 的資料夾,並把連線相關的程式碼放這邊,目前的目錄結構如下:
├── src
| ├── index.ts
| ├── app
| | └── app.routing.ts
| ├── database
| | ├── database.ts
| | └── index.ts
| └── environments
| ├── development.env
| └── production.env
├── package.json
└── tsconfig.json
可以看到在 database 下新增了 database.ts
與 index.ts
,主要的內容會放在 database.ts
中,透過 mongoose 的 connect
進行連線,在較新版的 mongoose 還需要額外添加 useNewUrlParser
來使用新版的 URL Parser,以及使用 useUnifiedTopology
來使用新版的引擎:
在
mongoose
6 版以後將useNewUrlParser
與useUnifiedTopology
的配置移除了,感謝熱心的 gogo.afuzzz 補充。
import mongoose from 'mongoose';
const DB_CONNECT_OPTIONS = {
useNewUrlParser: true,
useUnifiedTopology: true
};
export const Database = {
connect: () => {
mongoose.connect(
`mongodb+srv://${ process.env.DB_USER }:${ process.env.DB_PWD }@expressmvctodolist-clus.jjknt.gcp.mongodb.net/${ process.env.DB_NAME }?retryWrites=true&w=majority`,
DB_CONNECT_OPTIONS
)
.then(() => console.log('Database is connected.'))
.catch(err => console.log(err));
}
};
由於我們有使用到環境變數,所以需要去更改配置檔 development.env
:
PORT=3000
DB_USER=YOUR_DB_USER_NAME
DB_PWD=YOUR_DB_USER_PASSWORD
DB_NAME=YOUR_DB_NAME
只單獨新增 development 是因為開發環境所使用的資料庫會與正式環境有所不同,考量到目前是開發階段,所以只更改了 development
接著在 database 資料夾下的 index.ts
中進行匯出:
export * from './database';
最後,在 src 下的 index.ts
中添加下方程式碼來連線資料庫:
import { Database } from './database';
Database.connect();
這樣就完成連線了!
mongoose 是很熱門且好用的套件,前面有提到它是 Schema-based 的 ODM,這點很重要務必記得,因為 mongoose 其中一個核心概念就是 Schema,下一篇就會開始帶大家建立 Schema 並寫簡單的 CRUD,敬請期待!
Hi 最近剛好在學習 Node & Express,所以很常在這邊留言 XD
可以看到在 database 下新增了 database.ts 與 index.ts,主要的內容會放在 database.ts 中,透過 mongoose 的 connect 進行連線,在較新版的 mongoose 還需要額外添加 useNewUrlParser 來使用新版的 URL Parser,以及使用 useUnifiedTopology 來使用新版的引擎:
我這邊在測試的時候有發生兩項問題:
mongoose
版本 6.0.3
已經沒有提供 useNewUrlParser
& useUnifiedTopology
連接選項,似乎不需要提供上述選項了,可參考連接。@types/mongoose
,可參考連接。我這邊有針對 src\database\database.ts
調整寫法可參考Mongoose Error Handling
import mongoose from "mongoose";
export const Database = {
connect: async () => {
try {
await mongoose.connect(`${process.env.DB_URL}`)
console.log("Database is connected!")
} catch (err) {
console.error("Database connection error", err)
}
},
};
你好,很高興能幫助到你學習 node.js 與 MongoDB,也很感謝你的補充,我會在文章註名的