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

一.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
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值