一、node后端-基础搭建

使用到的技术有 JWTjs nodejs express mongoose mongod

目录

一、创建DB服务

1、创建连接mongodb服务器  /db/DB.js

2、将创建DB.js的导入根目录  /bin/www

二、配置modles

1、modles基础配置 配置数据库表字段 /models/UserModel.js

三、配置app.js  token鉴权

1、/app.js 基础配置

2、详细配置 middlewares/authMiddleware.js

四、封装token /util/JWT.js

五、配置路由 /routes/admin/UserRouter.js

六、配置controllers 

1、拿到前端数据 处理加工 进行调用数据库层 services

七、配置services

1、引用创建数据库模型 进行数据的增删改查操作


多目录分模块的开发是能够更加高效整洁

一、创建DB服务

1、创建连接mongodb服务器  /db/DB.js

const mongoose = require('mongoose')

mongoose.connect('mongodb://127.0.0.1:27017/project-two')

2、将创建DB.js的导入根目录  /bin/www

require('../db/DB.js')

二、配置modles

1、modles基础配置 配置数据库表字段 /models/UserModel.js

const mongoose = require('mongoose')
const Schema = mongoose.Schema

const UserType = {
  username: String,
  password: String,
  gender: Number,
  role: Number,
  avatar: String,
  notes: String
}

const UserModel = mongoose.model('user',UserType)

module.export = UserModel

三、配置app.js  token鉴权

1、/app.js 基础配置

app.use((req,res,next)=>{
  if(req.url==='/adminapi/user/login'){
    next()
    return
  }
  const token = req.headers['authorization'].split(' ')
  if(token){
    let payload = JWT.verify(token)
    if(payload){
      const newtoken = JWT.generate({
        _id:payload._id,
        username:payload.uername
      },'1d')
      res.header('Authorizaation',newtoken)
      next()
    }else{
      res.status(401).send({succes:'token过期'})
    }
  }
})

2、详细配置 middlewares/authMiddleware.js

const jwt = require('jsonwebtoken'); // 引入 JSON Web Token 库
const SECRET_KEY = 'your-secret-key'; // 替换为实际的密钥

// 验证 Token 的中间件
const verifyToken = (req, res, next) => {
  // 检查请求路径是否为登录路径,如果是,直接放行
  if (req.path === '/login') {
    return next();
  }

  // 获取请求头中的 Authorization
  const authHeader = req.headers.authorization;
  
  if (!authHeader) {
    return res.status(401).json({ message: 'No token provided' }); // 如果没有 Token,返回 401
  }

  // 从 Authorization 头中提取 Token
  const token = authHeader.split(' ')[1];

  // 验证 Token
  jwt.verify(token, SECRET_KEY, (err, user) => {
    if (err) {
      return res.status(403).json({ message: 'Invalid token' }); // Token 无效,返回 403
    }

    // 如果 Token 有效,创建新 Token 并重置时间
    const newToken = jwt.sign({ id: user.id }, SECRET_KEY, { expiresIn: '1h' }); // 新 Token 有效期为 1 小时

    // 将新 Token 返回给客户端
    res.setHeader('Authorization', `Bearer ${newToken}`);

    req.user = user; // 将用户信息添加到请求对象
    next(); // 继续处理请求
  });
};

module.exports = verifyToken;

四、封装token /util/JWT.js

// npm i jsonwebtoken
const jsonwebtoken = require("jsonwebtoken");
const secret = "happy";
const JWT = {
  generate(value, exprires) {
    return jsonwebtoken.sign(value, secret, { expiresIn: exprires });
  },
  verify(token) {
    try {
      return jsonwebtoken.verify(token, secret);
    } catch (error) {
      return false;
    }
  },
};

// JWT.generate();

module.exports = JWT;

五、配置路由 /routes/admin/UserRouter.js

var express = require('express');
var router = express.Router();
// npm i multer --save   专门处理multipart/form-data 表单数据
const multer = require('multer')
const upload = multer({dest:'public/avataruploads/'})
// 导入路由
const UserController = require("../../controllers/admin/UserController")


// 传过来的文件名 前端传过来的params 图片的写的是 file:file  对应的中间件写的是file

// 登录接口
router.post("/adminapi/user/login",UserController.login)
// 更新用户接口
router.post("/adminapi/user/upload",upload.single('file'),UserController.upload)
// 添加用户接口
router.post("/adminapi/user/add",upload.single('file'),UserController.add)
// 查所有用户
router.get("/adminapi/user/list",UserController.list)
// 查找一个用户
router.get("/adminapi/user/list/:id",UserController.list)
// 删除一个用户
router.delete("/adminapi/user/list/:id",UserController.delist)
// 修改一个用户
router.put("/adminapi/user/list/:id",UserController.putlist)

module.exports = router;

在app.js 导入

const UserRouter = require('./router/admin/UserRouter')
app.use(UserRouter)

六、配置controllers 

1、拿到前端数据 处理加工 进行调用数据库层 services

const UserService = require("../../services/admin/UserService");
const JWT = require("../../util/JWT");

const UserController = {
  login: async (req, res) => {
    const result = await UserService.login(req.body);
    if (result.length === 0) {
      res.send({
        code: "-1",
        error: "用户名或者密码错误",
      });
    } else {
      const token = JWT.generate(
        {
          _id: result[0]._id,
          username: result[0].username,
        },
        "1d"
      );
      res.header("Authorization", token);
      res.send({
        ActionType: "OK",
        data: {
          username: result[0].username,
          gende: result[0].gende ? result[0].gende : 0,
          introduction: result[0].introduction,
          avatar: result[0].avatar,
          role: result[0].role,
        },
      });
    }
  },
  upload: async (req, res) => {
    // req.body传过来的form表单数据  req.file传过来的文件头像
    const { username, introduction, gende } = req.body;
    const token = req.headers["authorization"].split(" ")[1];
    const avatar = req.file ? `/avataruploads/${req.file.filename}` : "";
    const payload = JWT.verify(token);
    const { _id } = payload;
    await UserService.upload({
      _id,
      username,
      introduction,
      gende: Number(gende),
      avatar,
    });
    if (avatar) {
      res.send({
        ActionType: "OK",
        data: {
          username,
          introduction,
          gende: Number(gende),
          avatar,
        },
      });
    } else {
      res.send({
        ActionType: "OK",
        data: {
          username,
          introduction,
          gende: Number(gende),
        },
      });
    }
  },
  add: async (req, res) => {
    // req.body传过来的form表单数据  req.file传过来的文件头像
    const { username, introduction, gende, password, role } = req.body;
    const token = req.headers["authorization"].split(" ")[1];
    const avatar = req.file ? `/avataruploads/${req.file.filename}` : "";
    // const payload = JWT.verify(token)
    // const { _id }  = payload
    // 调用server模块更新数据
    await UserService.add({
      username,
      introduction,
      gende: Number(gende),
      avatar,
      password,
      role,
    });
    // if(avatar){
    //     res.send({
    //         ActionType:"OK",
    //         data:{
    //           username,introduction,gende:Number(gende),avatar,password,role,
    //             gende: Number(gende)
    //         }
    //     })
    // }else{
    //     res.send({
    //         ActionType:"OK",
    //         data:{
    //           username,introduction,gende:Number(gende),password,role,
    //           gende: Number(gende)
    //         }
    //     })
    // }
    res.send({
      ActionType: "OK",
    });
  },
  // 查找用户
  list: async (req, res) => {
    const result = await UserService.list(req.params);
    res.send({
      ActionType: "OK",
      data: result,
    });
  },
  delist: async (req, res) => {
    const { id } = req.params;
    const result = await UserService.delist({ _id: id });
    res.send({
      ActionType: "OK",
      data: result,
    });
  },
  // 修改一个用户
  putlist: async (req, res) => {
    const result = await UserService.putlist(req.body);
    res.send({
      ActionType: "OK",
      data: result,
    });
  },
};

module.exports = UserController;

七、配置services

1、引用创建数据库模型 进行数据的增删改查操作

const UserModel = require("../../models/UserModel");

const UserService = {
  login: async (params) => {
    return UserModel.find({
      username: params.username,
      password: params.password,
    });
  },
  upload: async ({ _id, username, introduction, gende, password, avatar }) => {
    if (avatar) {
      return UserModel.updateOne(
        { _id },
        { username, introduction, gende, password, avatar }
      );
    }
    return UserModel.updateOne(
      { _id },
      { username, introduction, gende, password }
    );
  },
  add: async ({ username, introduction, gende, password, avatar, role }) => {
    return UserModel.create({
      username,
      introduction,
      gende,
      password,
      avatar,
      role,
    });
  },
  // 查找用户
  list: async({id})=>{
    return id?UserModel.find({_id:id},["username","role","introduction","gende","avatar","password"]):UserModel.find({},["username","role","introduction","gende","avatar"])
  },

  // 删除一个用户
  delist: async({_id})=>{
    return UserModel.deleteOne({_id})
  },

  // 更新一个用户
  putlist: async(body)=>{
    return UserModel.updateOne({_id:body._id},body)
  }
};

module.exports = UserService;
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值