RESTful API by node jsexpress 紀錄
計畫要做甚麼
簡單需要登入控制的SHOP
架構圖如下:
準備工具
資料庫
我用 MongoDB Atlas
有免費版本流量夠測試使用
/products
- /products:GET: 產品列表
- /products:POST: 產品新增
- /products/{id}:GET: 單一產品資訊
- /products/{id}:PATCH: 單一產品修改
- /products/{id}:DELETE: 單一產品刪除
/orders
- /orders:GET: 訂單列表
- /orders:POST: 訂單新增
- /orders/{id}:GET: 單一訂單資訊
- /orders/{id}:DELETE: 單一訂單取消
上圖紅色部分是需要使用者登入才能操作的請求。
目錄結構
部分程式碼講解
在製作過程會有一些遇到的問題在下面我都整理了起來
完整檔案在 GITHUB 上
Server.js
一些基本nodejs server設定
1 | const http = require('http'); |
App.js 部分
錯誤控制
基本的流程或是路由錯誤控制
1 | // errro control |
使用的套件或是middleware
1 | const express = require('express'); |
nodemon & morgan
好用的自動restart與debug模組
在 packeage.json
中加入 "start": "nodemon server.js"
morgan使用
在app.js.
中放入var morgan = require('morgan');
和app.use(morgan('dev'))
Router 部分
我是想有 orders products user5這三個部分﹐分別處理不同功能
orders products 需要跟controller 一起看
多了一個controller讓可讀性與維護性更高
基本上這部分都是一些資料庫控操作與權限控制
order部分
在mongoose models 地方有用了 ref這參數
product: { type: mongoose.Schema.Types.ObjectId, ref: 'Product', required: true },
product 這一欄參數是參考 Product這個集合的
在orders_get_all
就可以列出product這個集合的資料
在mongoose使用這個.populate("product", "name")
函數就可以控制
api token 實作方法
這裡是使用 JWT 這個套件來實作
在user/login
的地方
1 | { |
讓成功登入者取得TOKEN
在使用此TOKEN 來進行上述紅色需要驗證的部分
在所有需要驗證的URL錢加上middleware 來成功實作出API+驗證機制
checkAuth
使自己製作的middleware 在 middleware資料夾當中
1 | const jwt = require('jsonwebtoken') |
使用方式E.G. :router.post("/", checkAuth, upload.single('productImage'), ProductsController.products_create_product);
根據上面方式 使用postman 來測試
Body
HEADER
user部分
在signup 有用bcrypt 進行加密
1 | bcrypt.hash(req.body.password, 10,(err,hash) => { |