# **创建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过期" });
});
```