# **創建router**
router文件夾下創建 UserRouer.js
```
const express = require("express");
const router = express.Router();
const UserController = require("../controllers/UserController"); // 引入controller
router.post("/user/login", UserController.login); // 登錄
router.get("/user/logout", UserController.logout);// 登出
module.exports = router;
```
在app.js中引入路由
```
const UserRouter = require("./routes/UserRouter");
app.use(UserRouter);
```
# **創建controller**
創建controllers文件夾
創建UserController.js文件
```
const UserServices = require("../services/UserService"); //引入 service
const jwt = require("../util/JWT"); // 引入jsonwebtoken -- token
const UserController = {
login: async (req, res) => {
const result = await UserServices.login(req.body); // 登錄驗證賬號,返回數組
if (result.length == 0) {// 沒找到對應賬號
// 返回錯誤
res.send({ code: 401, msg: "用戶名或密碼不匹配" });
return;
}
// 組裝返回前端項目json數據
let data = {
...result[0]._doc,
id: result[0]._id,
aaa: 12,
};
// 創建token
const token = jwt.generate(
{
name: data.username,
id: data.id,
},
"7d"
);
// 設置響應頭 授權token
res.header("Authorization", `Bearer ${token}`);
// 返回給前端數據
res.send({ code: 200, msg: "登錄成功", data: { ...data } });
},
logout: (req, res) => {
res.send({ code: 200, msg: "退出成功" });
},
};
module.exports = UserController;
```
# **創建service**
創建services文件夾
創建UserService.js文件
```
const UserModel = require("../modules/UserModel"); // 引入mongoDb 模塊
const UserService = {
login: async ({ username, password }) => {
return UserModel.find({// 查詢數據庫
username,
password,
});
},
};
module.exports = UserService;
```
# **創建modules**
創建modules文件夾
創建UserModule.js文件
```
const mongoose = require("mongoose");// 調用mongoose
const Schema = mongoose.Schema;
const UserType = {// 數據格式
username: String,
password: String,
gender: Number, // 性別, 0,1,2
instanceof: String,
avatar: String,
role: Number,
};
const UserModel = mongoose.model("user", new Schema(UserType, {
timestamps: true, // 自動添加創建時間和修改時間字段
}));
module.exports = UserModel;
```
# **創建 config**
創建config文件夾
創建db.config.js文件
```
const mongoose = require("mongoose");
mongoose.connect("mongodb://127.0.0.1:27017/nodeceshi");// 鏈接本地mongodb數據庫
```
在bin/www中引入db.config.js
```
require("../config/db.config");
```
# **創建 JWT**
創建util文件夾
創建JWT.js文件
```
const jsonwebtoken = require("jsonwebtoken"); // 引入jsonwentoken
const secret = "your_secret_key"; // 秘鑰
const JWT = {
generate(value, expires) { // 創建token
return jsonwebtoken.sign(value, secret, { expiresIn: expires });
},
verify(token) {// 驗證token
try {
return jsonwebtoken.verify(token, secret);
} catch {
return false;
}
},
};
module.exports = JWT;
```
在app.js中引入jwt,創建中間件驗證接口token是否過去
```
const jwt = require("./util/JWT");// 引入
app.use((req, res, next) => {//創建中間件
const Whitelist = ["/admin/user/login"]; // 不參與檢查token的白名單,例如登錄接口
if (Whitelist.includes(req.url)) {
next();
return;
}
const token = req.headers.authorization.split(" ")[1]; // 截取請求頭中的token
const payload = jwt.verify(token);// 驗證token
if (payload) {
// 通過后創建新的token
const newToken = jwt.generate(
{
name: payload.name,
id: payload.id,
},
"7d"
);
// 重新設置響應頭token
res.header("Authorization", `Bearer ${newToken}`);
// 繼續
next();
return;
}
// 返回token過期,前端通過接口狀態401做處理
res.status(401).send({ msg: "token過期" });
});
```