🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# **创建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过期" }); }); ```