iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 14
0
自我挑戰組

轉職道上的萌芽人生 − 自學程式開發ing系列 第 14

Day 14- 190930學習筆記 建立Database (Mongoose/MongoDb)

  • 分享至 

  • xImage
  •  

今天的內容介紹如何使用 Database(使用 Mongoose/MongoDb)


前言

  • 與 Database 對接的方式有兩種:
    • 使用其原生語言(SQL
    • 使用 ODM/ORM:將網站資料表示為 JS object,再 map 到 Database。
      (Object Data Model / Object Relational Model)
      (ORM 對應 SQL-Bsaed Database / ODM 對應 NoSQL Database)
  • ODM/ORM通常可以降低開發及維護成本,因此一般情況推薦使用ODM。
  • 此教學推薦使用 ODM:Mongoose 對應 Database:MongoDb,因此接下來將介紹使用 Mongoose 建立 model,使用其對接並在 MongoDb 上建立資料。

MongoDB database

教材是先介紹 Mongoose 基本用法,但對新手我而言,還不熟悉這之間結構上的關聯,並非易懂,因此後來我先跳到後半段,先將其結構建出來,再回頭看比較清楚他們之間想達成的動作。

  • 首先可以安裝 MongoDB 在主機,或是使用雲端,而我跟著教學使用MongoDB Atlas free cloud-hosted sandbox database
  • 使用者名稱/密碼需避免使用特殊字,因為使用 Mongoose 對接時,須讓 Mongoose 能夠辨認。
  • 最後可以獲得一段 URL ,用於連結至 Database,樣式大致如下:
mongodb+srv://使用者名稱:密碼@cluster0-mbdj7.mongodb.net/local_library?retryWrites=true
  • 記得將其使用者密碼換上後,保存起來以利後續使用。

Mongoose

  • 安裝 Mongoose 套件
    npm install mongoose
    
  • 設定讓 mongoose 連結到你的 MongoDB database ,並在無法連結時,於console上告知連結錯誤:
    (在 /app.js 的 const app = express()底下加入新的code)
    const mongoose = require('mongoose')
    const mongoDB = '你 MongoDB 的 URL'
    mongoose.connect(mongoDB, { useNewUrlParser: true })
    const db = mongoose.connection
    db.on('error', console.error.bind(console, 'MongoDB connection error:'))
    
  • 為每一個 model 建立一個獨立的 module
    (先於專案中創建 model 資料夾,專門放置各個 model(如author.js、book.js、bookinstance.js、genre.js))
  • 以 Author 這個 model 為例:
    (在 ./models/author.js 中書寫以下的code)
    const mongoose = require('mongoose')
    const Schema = mongoose.Schema
    // 先新增 Author 的 Schema ,其中可設定姓名、生卒年等,可對其 value 的規格做限制。
    const AuthorSchema = new Schema(
      {first_name: { type: String, required: true, max: 100 },
       family_name: { type: String, required: true, max: 100 },
       date_of_birth: { type: Date },
       date_of_death: { type: Date }})
    // 接著可設定一些 virtual 的屬性,方便使用,但這些屬性不會存進 database。
    AuthorSchema.virtual('name').get(function () {return this.family_name + ', ' + this.first_name})
    
    AuthorSchema.virtual('lifespan').get(function () {return (this.date_of_death.getYear() - this.date_of_birth.getYear()).toString()})
    // 並用 _id 來產生其 URL。
    AuthorSchema.virtual('url').get(function () {return '/catalog/author/' + this._id})
    // 最後再輸出 module 以供使用。
    module.exports = mongoose.model('Author', AuthorSchema)
    

測試:

  • 最後先用教材提供的一個腳本,來測試以上創建的 model 可否順利藉由 Mongoose 連結到 MongoDB database。
  • 將教材提供的 populatedb.js 放置於根目錄(package.json所在目錄)。
  • 安裝 async module(執行populatedb.js所需,後續說明):
    npm install async
    
  • 在 terminal 執行 node populatedb '你 MongoDB 的 URL',以在 MongoDB 創建 populatedb.js 所描寫的資料。
  • 再到 MongoDB ,就能看見已新增資料啦。
    https://ithelp.ithome.com.tw/upload/images/20191001/20120981tsZKi1d8AP.png

上一篇
Day 13- 190929學習筆記 Node.js Express 結構分析
下一篇
Day 15- 191001學習筆記 Mongoose
系列文
轉職道上的萌芽人生 − 自學程式開發ing30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言