iT邦幫忙

2024 iThome 鐵人賽

DAY 13
0
Mobile Development

30天 使用chatGPT輔助學習APP完成接案任務委託系列 第 13

[Day13] API開始之前的 Setup:Docker 與 MongoDB 的安裝

  • 分享至 

  • xImage
  •  

昨天和大家介紹了 API還有 CRUD的概念,那今天就要來實作了。不過進行實作之前比較麻煩的就是 Setup所需要的軟體。 後端的主要程式框架-nest.js我們設置好了,如果還沒設置好的朋友可以參考前面幾天的文章 [Day11] 開始後端 Nest.js

今天正式進入後端開發,教大家如何建立 API。但是API 需要和資料進行互動,我們需要先準備好資料庫🗄️(Database, DB)。

資料庫

資料庫(DB)是用來儲存和管理大量資料的系統,它幫助應用程式有組織地保存、讀取、更新和刪除資料。在現代開發中,資料庫分為兩種主要類型:

  1. 關聯式資料庫(SQL):資料儲存在表格中,並且有明確的關聯結構。常見的有 MySQL、PostgreSQL 等。
  2. 非關聯式資料庫(NoSQL):資料以文件、鍵值對或圖形結構儲存,沒有固定的表格結構。常見的有 MongoDB、Cassandra 等。

這次的專案我們選用 MongoDB,它是一個 NoSQL 資料庫,使用 JSON 格式來儲存資料,結構靈活且易於擴展,非常適合現代應用程式。

Docker

Docker 是一個開放原始碼的平台,它能夠幫助開發者把應用程式和其依賴的環境一起打包成一個「容器」,這樣無論在哪裡執行,應用程式的行為都會保持一致。

「我的電腦可以跑,為什麼你的不行?」是不是很常聽到這句話🤣。因為每個人的電腦環境都可能不太一樣,可能安裝的軟體版本,套件操作系統不一樣都會導致一樣的程式碼在不同的電腦跑起來不一樣。

Docker 就是用來解決這個問題的,它能夠將應用程式和它所需的環境打包在一個「容器」裡,這樣容器內部的環境總是固定的,無論在哪個伺服器上運行,行為都會保持一致。

但我們這邊使用 Docker來裝資料庫,並不是為了這個。主要是因為身為資深的開發者(自己說)電腦裡面通常會有很多不一樣的開發環境,甚至是不同版本的資料庫都會有。

安裝 Docker

我們這邊只舉例 Mac 的,Windows的讀者抱歉了。後續有機會會再更新。我記得 windows 會比較麻煩,如果是家用版本的話還需要先安裝虛擬機軟體之類的。但不知道過了這麼多年有沒有不一樣了。

下載安裝

  1. 安裝 Docker Desktop

    • 打開 Docker 官方網站
    • 下載適合你作業系統的 Docker Desktop 版本,並進行安裝。
    • 安裝完成後,打開 Docker Desktop,確認 Docker 已經啟動。
  2. 檢查 Docker 是否安裝成功

    • 打開終端機,輸入以下指令來確認 Docker 是否已經正確安裝:
	docker --version

終端機安裝

我比較喜歡用終端機安裝,當初學寫程式的時候就覺得用終端機打指令安裝比較帥。當我轉職後看到其實大家 git 比較喜歡用 gui ,git 指令比較不熟的時候,我超意外的,我以爲工程師都很喜歡打指令。

  1. 安裝 docker
brew install docker

如果沒有 brew 要先安裝喔。

  1. 檢查 Docker 是否安裝成功
docker --version

安裝 MongoDB

前面安裝好了 Docker,現在我們要使用 Docker 啟動一個 MongoDB 容器。來問一下我們GPT好朋友吧。

請問我要如何在 docker裡面開一個 mongodb呢

[!Info] GPT 回應
在 Docker 中運行 MongoDB 的過程相對直觀,您可以通過以下步驟來完成:

  1. 下載 MongoDB 的 Docker 映像檔案: 使用 Docker 命令下載官方的 MongoDB 映像檔案:
docker pull mongo
  1. 啟動 MongoDB 容器: 您可以使用下面的命令來啟動一個 MongoDB 的容器。這個命令中包含了一些基本的配置選項,例如設定容器名稱和指定映射到本機的端口:
docker run --name my-mongo -p 27017:27017 -d mongo

這條命令做了以下幾件事:

  • --name my-mongo:給容器設定一個名稱為 my-mongo
  • -p 27017:27017:將容器的 27017 端口映射到本機的同一端口,MongoDB 默認使用 27017 端口。
  • -d:在後台模式運行容器。
  • mongo:使用的是名為 mongo 的映像檔案。
  1. 檢查容器運行狀態: 使用下面的命令來查看容器的運行狀態:
 docker ps

如果容器正常運行,您應該能在列表中看到 my-mongo

下載Mongo:
我們照著GPT的指示來一次,先下Pull指令。

docker pull mongo

會看到終端機開始下載。

啟動 MongoDB 容器:
再來就是啟動DB,我們這裡把DB名字修改成 ITHelp,port 修改成 29017,因為我電腦裡面有很多DB port。修改一下才不會衝突。

我這邊想解釋一下, 290

docker run --name ITHelp -p 29017:27017 -d mongo

成功的話會回應你一串容器ID。

[!NOTE]
29017:27017 代表將容器內部的port映射到主機的port。這裡的意義如下:

  • 27017:這是 MongoDB 容器內部使用的默認port。MongoDB 預設在這個port接收連接請求。

  • 29017:這是您的 Docker 主機上的port。您選擇將 MongoDB 容器的 27017 port 映射到主機的 29017port。這樣我就可以連接 docker的 29017 port 避免衝突。

檢查容器運行狀態:
我可以理解只打終端機,但其實不知道發生什麼事的那種感覺。這邊可以再下一下指令,看一下 docker 運行狀況。

docker ps

就可以看到目前在運行的 docker 容器。可以看到我們 ITHelp DB有好好的在運行。各位不用擔心

其實不想打指令的朋友,打開 docker desktop 也可以看到 DB 是否有好好的在運行。

Nest.js 與DB連線

啟動了 Docker,那要怎麼把後端程式 Nest.js 連線到 DB呢。一樣回到 Cursor 來問問看他是否可以幫忙。

我想把 app 連接 mongodb,我的 db port 是 29017,資料庫名稱是 ITHelp 麻煩幫我接一下,感謝。

[!Info] GPT回應
要將你的 NestJS 應用程式連接到 MongoDB,你需要安裝 @nestjs/mongoosemongoose 這兩個套件,然後在你的應用程式中進行配置。以下是具體步驟:

  1. 安裝必要的套件

在你的專案目錄中運行以下命令來安裝 @nestjs/mongoosemongoose

yarn add @nestjs/mongoose mongoose
  1. 更新 app.module.ts

src/app.module.ts 中,導入 MongooseModule 並配置 MongoDB 連接:

import { Module } from '@nestjs/common';
import { MongooseModule } from '@nestjs/mongoose';
import { AppController } from './app.controller';
import { AppService } from './app.service';

@Module({
  imports: [
    MongooseModule.forRoot('mongodb://localhost:29017/ITHelp'),
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

這樣你的應用程式就應該能夠連接到 MongoDB 資料庫 ITHelp 了。如果有任何問題,請檢查 MongoDB 的連接字串和服務狀態。

讓 Curosr 自動幫你處理就可以連接到資料庫了。接著我們明天會請 Curosr 給我們一個簡單的創建使用者範例。開始我們的CRUD之旅接著就可以在之前的註冊APP畫面真實的註冊帳號並登入了。不過其實還要做的事情還滿多的😅

工商時間

又到了我們最後的工商時間啦~~~。Tom有在經營 Pocast,目前比較偏向職場類的閒聊,未來Podcast預計更新與程式軟體開發相關的主題。有興趣的朋友follow一下。

可以透過以下平台收聽: Apple podcast Spotify KKBOX
Linking Tree


上一篇
[Day12] API 與 CRUD 概念:後端開發的基本功
下一篇
[Day14] 註冊會員API
系列文
30天 使用chatGPT輔助學習APP完成接案任務委託30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言