使用express和mongoose进行CURD和注册 登录 TOKEN验证操作

it2022-05-05  155

一.CURD

1.安装 mongoose: npm i mongoose --save( --save可以不写 新版npm会自动保存依赖 )

   安装 express: npm i express@next ( @next是安装express的下一个版本 还未发布的版本 )

2.在主入口文件 app.js 里面

 

// 首先引入 express const express = require("express"); // 得到一个express的实例 const app = express(); app.use(express.json()) /* 使用mongoose来连接数据库 */ const mongoose = require("mongoose") /* 连接数据库 */ mongoose.connect("mongdb://localhost:27017/express-test",{ useNewUrlParser: true }) /* 建立模型集合 就是表 */ const Product = mongoose.model("Product",new mongoose.Scheam({ title: { title: String } // 字段为 title 类型为 String })) // 根据发送的请求 进行相关的操作 app.get("/",async(req,res)=>{ //cosnt data = await Product.find().limit(2).skip(1) // 分页 1页2条数据 //const data = await Product.find().where({ title: "apple" }) // 查找title为apple的数据 //const data = await Product.find().sort({ "_id": 1 }) // 1表示正序 -1表示倒叙 const data = await Product.find() // 查找全部的数据 res.send(data) // 发送给前端 }) // 根据 id 来进行查询数据 app.get("/:id",async(req,res)=>{ const data = await Product.findById(res.params.id) res.send(data) }) // 新增数据post请求 app.post("/add",async(req,res)=>{ const data = req.body // 这边需要express开启才能得到在body里面 得到(就是中间件) const adddata = await Product.create(data) res.send(adddata) }) // 根据 id 去修改数据展示 app.post("/update/:id",async(req,res)=>{ const pro= await Product.findById(req.params.id) // 先通过 id 找到相关的数据展示 pro.title = req.body.title // 直接将发送过来的数据 进行保存 await pro.save() // 一定要记得保存啊 res.send(pro) }) // 根据id删除相关的数据 app.post("/delete/:id",async(req,res)=>{ const pro = await Product.findById(req.params.id) await pro.remove() res.send(pro) }) /* 先往mongodb的数据库为 express-test 的表为 Product 插入一些数据(直接使用语句插入) */ Product.insertMany([{ title: "apple", title: "banana" ]) // 这样 集合里面就有两条数据了 // 开启端口号 app.listen(4000,()=>{ console.log("http:localhost:4000") })

3.这边要介绍一个类似于 postman 的工具,VSCode的一个插件 REST Client 就可以直接在VSCode里面发送请求了

1.建立一个 test.http 文件 必须是 .http结尾 @uri=http://localhost:4000/ ### GET {{uri}} ### GET {{uri}}5d248c9ead7a151c708db9ad ### POST {{uri}}post Content-Type: application/json { "title": "产品" } ### POST {{uri}}update/5d2f227e62ab371e907b6ef7 Content-Type: application/json { "title": "66666" } ### POST {{uri}}delete/5d2727ac2d88e412c801c930 ### POST {{uri}}delete // 注意的是:如果我们写了 发送的格式的话 就像 Content-Type: applictiaon/json 下面必须空一行

二.注册登录以及Token的验证

项目的目录结构如下

 

连接数据库的数据层

/* 首先要说明的是 我们的密码一般都是要进行加密的 这是比较道德的 */ 1. 加密密码首先要一个插件 npm i bcrypt 2.require("bcrypt").hashSync(val,10) // 第一个参数是 要散列的值 第二个参数散列的强度 3.require("bcrypt").compareSync(原密码,数据库里面已经加密的) // 就是做散列的比较 // 连接 mongodb 数据库 就是模型层 const mongoose = require(""mongoose) mongoose.connect("mongodb://localhost:27017/express-auth",{ useNewUrlParser: true, useCreateIndex: true }) const User = mongoose.media("User", new mongoose.Schema({ // 这个unique表示唯一的 表示往表里面插入数据的时不能重复 username: { type: String, unique: true }, password: { type: String, // 把前端传递过来的数据 进行设置 set(val){ require("bcrypt").hashSync(val,10) // 把前端传递过来的数据进行散列加密 强度为10 } } })) module.exports = { User }

在入口文件 app.js主入口文件

/* token的生成说明: */ 1.jsonwebtoken 同于生成token 安装 npm i jsonwebtoken 2. const jwt = require("jsonwebtoken") 3. 签名:jwt.sign(主键,明文) 4. 解开:jwt.verify(前端传递过来的token,明文) // 引入连接数据库的模型层文件 const { User } = require("./models") const express = require("express") const app = express() app.use(express.json()) // 让express能够解析前端传递来下的json // 查询全部的数据 app.get("/api/users",async(req,res)=>{ const data = await User.find() res.send(data) }) // 注册 app.post("/api/register",async(req,res)=>{ const data = await User.create({ username: req.body.username, password: req.body.password }) res.send(data) }) // 登录 app.post("/api/login",async(req,res)=>{ // 登录流程 1.先看 用户名是否存在 2.在进行密码与数据库的密码进行匹配 const isUser = User.findOne({ // 先在数据库里面找到对应的数据 username: req.body.username }) if(isUser === null){ return res.status(422).send({ message: "您输入的用户名有误" }) } // 接下来检验密码 compareSync( 前端传入的密码, 数据库散列好的密码 ) const isPass = require("bcrypt").compareSync( req.body.password, isuser.password ) if(!isPass){ // 如果匹配失败的话 return res.status(422).send({ message: "您输入的密码不正确" }) } // 进行签名加密 jwt.sign( 要签名的字段(最好是唯一的主键什么的),第二个就是明文(可以随便写) ) const token = jwt.sign({ id: String(isUser._id) },SECRET) // 返回给前端 res.send(isUser,token) }) /*接下来使用token*/ app.post("/api/profile".async(req,res)=>{ const raw = String(req.headers.authorization) // 前端把token放在了请求头里面 const { id }= jwt.verify(raw,SECRET) // 解密token ( 加密的参数,第二个参数是明文 ) const us = await User.findById(id) // 这样就实现了根据token 实现了请求 res.send(us) }) app.listen(8000,()=>{ console.log("请访问:http://127.0.0.4:8000") })

 


最新回复(0)