iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 11
1
Software Development

今晚我想來點 Express 佐 MVC 分層架構系列 第 11

[今晚我想來點 Express 佐 MVC 分層架構] DAY 11 - 用 mongoose 連線 MongoDB

mongoose 是什麼?

https://ithelp.ithome.com.tw/upload/images/20200819/201193380arQNoIQjv.png
圖片來源

Express 要與 MongoDB 溝通的方式有好幾種,其中最知名的就是 mongoose 這個套件了,它是一個 ODM 套件,採用 schema-based,讓我們能用較簡單的方式來存取 MongoDB。

安裝 mongoose

一樣透過 npm 進行安裝:

npm install mongoose

安裝 type 定義檔:

npm install @types/mongoose --save-dev

mongoose 6 版以後不需要額外安裝 type 定義檔,感謝熱心的 gogo.afuzzz 補充。

與 MongoDB 連線

我們可以透過 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.tsindex.ts,主要的內容會放在 database.ts 中,透過 mongoose 的 connect 進行連線,在較新版的 mongoose 還需要額外添加 useNewUrlParser 來使用新版的 URL Parser,以及使用 useUnifiedTopology 來使用新版的引擎:

mongoose 6 版以後將 useNewUrlParseruseUnifiedTopology 的配置移除了,感謝熱心的 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();

這樣就完成連線了!
https://ithelp.ithome.com.tw/upload/images/20200820/20119338gO6h5AVtIU.png

小結

mongoose 是很熱門且好用的套件,前面有提到它是 Schema-based 的 ODM,這點很重要務必記得,因為 mongoose 其中一個核心概念就是 Schema,下一篇就會開始帶大家建立 Schema 並寫簡單的 CRUD,敬請期待!


上一篇
[今晚我想來點 Express 佐 MVC 分層架構] DAY 10 - 設置 MongoDB
下一篇
[今晚我想來點 Express 佐 MVC 分層架構] DAY 12 - mongoose 之 CRUD
系列文
今晚我想來點 Express 佐 MVC 分層架構30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
gogo.afuzzz
iT邦新手 5 級 ‧ 2021-11-15 20:55:15

Hi 最近剛好在學習 Node & Express,所以很常在這邊留言 XD

可以看到在 database 下新增了 database.ts 與 index.ts,主要的內容會放在 database.ts 中,透過 mongoose 的 connect 進行連線,在較新版的 mongoose 還需要額外添加 useNewUrlParser 來使用新版的 URL Parser,以及使用 useUnifiedTopology 來使用新版的引擎:

我這邊在測試的時候有發生兩項問題:

  1. Mongoose 連接選項的調整
    這邊由於 mongoose 版本 6.0.3 已經沒有提供 useNewUrlParser & useUnifiedTopology 連接選項,似乎不需要提供上述選項了,可參考連接
  2. Mongoose 已有自己定義的類型
    所以不需要安裝 @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)
      }
  },
};

HAO iT邦研究生 3 級 ‧ 2021-11-17 21:20:48 檢舉

你好,很高興能幫助到你學習 node.js 與 MongoDB,也很感謝你的補充,我會在文章註名的/images/emoticon/emoticon41.gif

我要留言

立即登入留言