2025-07-04 Line A 階段:LINE webhook + Node.js + MySQL(最小可行版本)
2025-07-04 Line A 階段:LINE webhook + Node.js + MySQL(最小可行版本)
從 A 階段(最小可行原型) 立刻開始:目標是建立可接收 LINE Webhook 的 Node.js 伺服器,並把來自使用者的訊息寫入 MySQL(後端跑在你的 Lenovo)。整個流程會包含:資料庫初始化、後端程式碼、環境變數設定、用 ngrok 曝露 webhook、以及實測步驟與檢查點。
下面是一步一步的操作手冊——可直接複製貼上執行。
A 階段:LINE webhook + Node.js + MySQL(最小可行版本)
目標成果
- Node.js 後端能接收 LINE Webhook,回覆訊息並把訊息寫入 MySQL
messages_log。 - 能用 ngrok 把本機
http://localhost:3000/line/webhook暴露給 LINE 並測試。 - 程式碼存到 GitHub(不含
.env)。
前置條件(請先完成)
- Lenovo(開發主機)已安裝 Node.js(建議 v18+)與 npm。若沒安裝,請用 nvm-windows 或官網安裝器。
- Lenovo 已安裝 MySQL Server,知道 root 或其他使用者密碼。或已註冊 PlanetScale(若使用雲端 DB,請準備好連線字串)。
- 已有 GitHub 帳號(會推 code 到 repo)。
- 已安裝 ngrok 並完成驗證(ngrok authtoken)或準備安裝。
- 已註冊 LINE Developers 帳號(稍後要建立 channel)。
檔案結構(最終會長這樣)
1 | line-order-system/ |
Step 0 — 建 GitHub repo(若尚未建立)
- 在 GitHub 建 repo:
line-order-system(Private 或 Public 都可)。 - clone 到 Lenovo:
1 | cd D:\Projects |
Step 1 — 建資料庫與初始化 SQL
在 backend/db_init.sql 放以下內容(複製整段):
1 | -- db_init.sql |
執行 SQL(若在本機 MySQL)
- 用 MySQL Workbench 或命令列匯入:
1 | mysql -u root -p |
- 確認:
1 | USE line_order_db; |
如果你用 PlanetScale,使用其 Console 的 「Run schema」 或者透過 CLI 執行相同 SQL。
Step 2 — 建立後端專案 & 安裝套件(在 backend 目錄)
在 line-order-system/backend:
1 | cd backend |
編輯 package.json(加入 scripts 與 type):
1 | { |
安裝套件:
1 | npm install express cors dotenv mysql2 @line/bot-sdk |
Step 3 — 建置 .env.example 與 .gitignore
在 backend/.env.example:
1 | # LINE |
在 backend/.gitignore(或 repo 根目錄)加入:
1 | node_modules/ |
注意:不要把實際
.env推到 GitHub。使用.env.example讓其他開發者知道要填何種變數。
Step 4 — 寫程式碼(貼好檔案)
backend/db.js
1 | // backend/db.js |
backend/routes/line.js
1 | // backend/routes/line.js |
backend/index.js
1 | // backend/index.js |
Step 5 — 建立本機 .env(不要上傳)
在 backend 建 .env,填入你的真實值(不要推上 GitHub):
1 | LINE_CHANNEL_SECRET=xxxx |
Step 6 — 啟動伺服器並測試本機
在 backend 目錄啟動:
1 | npm run dev |
在瀏覽器開 http://localhost:3000/ 應顯示 Line Order Backend - OK。
在 http://localhost:3000/health 看到 {status: "ok"}。
Step 7 — 用 ngrok 暴露 webhook(在 Lenovo)
- 啟動 ngrok(假設你已安裝且驗證過):
1 | ngrok http 3000 |
- ngrok 會顯示一個公開 URL,例如:
https://a1b2c3d4.ngrok.io - 你的 LINE webhook 完整 URL 路徑會是:
https://a1b2c3d4.ngrok.io/line/webhook
Step 8 — 在 LINE Developers 設定 Webhook(建立 Channel)
登入 LINE Developers → 建立 Provider → 建立 Channel (Messaging API)。
在 Channel 設定頁填入
Channel name、選類別、上傳 Icon(非必要)。取得
Channel secret與Channel access token(存進你的backend/.env)。在 Channel 的 Messaging API 設定區塊:
- Webhook URL:貼上
https://<your-ngrok>/line/webhook - 點「Verify」應該顯示成功(若顯示失敗,檢查伺服器有沒有運行與 ngrok URL 是否正確)。
- 啟用「Use webhook」。
- Webhook URL:貼上
Step 9 — 實機測試(手機 LINE)
- 在 Channel 裡的「Messaging API」頁面找到「QR Code」或「Add as friend」方式,把你的 LINE Official Account 加為好友(或把 Developer Channel 的測試號加入)。
- 用手機對帳號傳文字(比如
測試或Hello)。 - 預期:Bot 回覆
收到:Hello(這是測試回覆),而且 MySQLmessages_log會多一筆紀錄。 - 確認 DB:
1 | SELECT id, line_user_id, message_text, created_at FROM messages_log ORDER BY id DESC LIMIT 5; |
Step 10 — 推到 GitHub(不包含 .env)
在 repo 根目錄:
1 | cd ../ # 回到 line-order-system 根 |
確認
.gitignore有.env並且沒有把.env推上去。
Checkpoints(驗收)
-
http://localhost:3000/顯示 OK。 - ngrok 提供的公開 URL 可以
POST到/line/webhook(LINE Verify 成功)。 - 手機傳文字給 LINE 帳號,Bot 會回覆。
- MySQL
messages_log能看到該訊息的紀錄(raw_event 欄位有 JSON)。 - 程式碼已 push 到 GitHub(但
.env未上傳)。
常見問題與排錯建議
- ngrok 驗證失敗 → 確認本機 server 有運行且能在
http://localhost:3000/line/webhook回 200。用 curl 測試:
1 | curl -X POST http://localhost:3000/line/webhook -H "Content-Type: application/json" -d '{"events":[]}' |
- LINE Verify 顯示「Invalid signature」→ 檢查
.env的LINE_CHANNEL_SECRET是否正確;@line/bot-sdkmiddleware 會驗證簽章。 - MySQL 寫入失敗 → 檢查
backend/db.js的連線參數與 DB 是否已建立line_order_db、table 是否存在。 - 若使用 PlanetScale → 連線字串與普通 MySQL 會有差異(需使用 TLS 與特殊用戶名),請參考 PlanetScale 的連線說明並把值放到
.env。
安全提示(開發階段就應遵守)
- 不要在任何公開地方(Slack、聊天室、GitHub)貼
LINE_CHANNEL_ACCESS_TOKEN或.env內容。 - 在 GitHub 設置 Branch 保護、PR 流程(未來)。
- 若要多人協作,把
.env.example提供給其他人,讓他們在本地建立各自的.env。
下一步建議(A 階段完成後)
如果你通過 A 階段檢查點,我建議接下來做:
- 在後端新增「簡單指令解析」:
我要點餐→ 回傳商品清單(從 MySQL 讀取)。 - 新增
orders、order_itemsSQL schema(我們的 full 手冊 B 階段內容)。 - 在 frontend 開始做管理後台的最小 UI(顯示 messages_log 與商品列表)。
如果你要,我可以:
- 立刻幫你把
backend的這一套檔案 打包成可以直接git clone並執行 的 starter repo(包含README、db_init.sql與所有檔案),或 - 以你現在的環境給出逐步的命令行輸入腳本(PowerShell / CMD)來在 Lenovo 一鍵建立這個後端與 DB(包含範例 seed 資料)。
你要先哪一個?(我會直接給出 repo 的檔案清單或一鍵腳本,供你拷貝執行)