IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> expressmongodbjwt生成tokenbcrypt密码加密... -> 正文阅读

[大数据]expressmongodbjwt生成tokenbcrypt密码加密...

express+mongoose

登录注册步骤

1.安装express nodemon RSET Client

// vscode install RSET Client 以代码的形式去发起请求类似postman
const express = require('express')
const app = express()
app.get('/', async(req,res)=?{
	console.log('ok')
})
app.listen(3000,()=>{
	console.log('http://localhost:3000')
})

2.RSET Client使用

@url=http://localhost:3000/api  // 这里定义全局变量
@json=Content-Type: application/json // 注意post请求都需要加这个,所以定义全局变量

### 
GET {{url}}  // 默认 / 地址

### 注册
POST {{url}}/register //api/register
{{json}}

{
  "username":"zs",
  "age":12
}

3.建立mongoDB连接,最好在models文件下操作db数据库,

models/db.js
const mongoose = require('mongoose')
// 这里的mongodb://127.0.0.1:27017/express-auth也可以封装到config里面,再引入进来
mongoose.connect('mongodb://127.0.0.1:27017/express-auth')
module.exprots = mongoose

4.建立user模型

// 封装一个userModel.js
// 引入db.js
const db = require('./db');
const userSchema = db.Schema({
  username: { type: String },
  password: { type: String }
})
module.exports = db.model('User', userSchema, 'user')

5 使用express.json

app.use(express.json())
/* 可以不用了 express有了处理json的了 */
 // const bodyParser = require('body-parser')
// app.use(bodyParser.urlencoded({ extended: false }))
// app.use(bodyParser.json())
// 对req.body的处理,转json字符串

6.将项目的路由抽离出来,可以协作多人开发

app.use('/', require('./router/index.js'))
app.use('/api', require('./router/api.js'))

// router/index.js

const express = require('express');
const router = express.Router()
router.get('/', (req, res) => {
  res.send('首页')
})
module.exports = router
// router/api.js
const express = require('express');
const router = express.Router()
router.use('/user', require('./api/user'))
module.exports = router
// router/api/user.js
const express = require('express');
const router = express.Router()
/* 登录 */
router.post('/', (req, res) => {
  res.send('登录xxxx啊')
})
module.exports = router

8.在user.js里写引入userModel.js(注册)

const express = require('express');
const userModel = require('../../models/userModel');
const router = express.Router()
router.post('/register', async (req, res) => {
    // 新增
  const user = await userModel.create({
    username: req.body.username,
    password: req.body.password
  })
  res.send(user)
})
module.exports = router
// http 发送请求
@url=http://localhost:3000/api
@json=Content-Type: application/json

### 
GET {{url}}

### 注册
POST {{url}}/user/register
{{json}}

{
  "username":"zs",
  "password":"123456"
}

7. 限定用户名唯一(注册)

// 必须 在Schema中添加unique:true, 在options中添加useCreateIndex:true
// 链接的时候也要添加option
mongoose.connect(dbUrl, (err) => {
  if (err) {
    console.log(err);
    return
  }
  console.log('连接数据库成功');
}, { useCreateIndex: true })
// 
const userSchema = new db.Schema({
  username: {
    type: String,
    unique: true // 这里主键,唯一
  },
  password: { type: String }
})

8 在Schema中设置密码加密(注册)

// npm i bcrypt
  password: {
    type: String, set (val) {
      return require('bcrypt').hashSync(val, 10)
    }
  }
// 在登陆的时候查看(查看条件就是用户名,密码不需要写进判断)数据库有了,在比较密码require('bcrypt').compareSync(明文,加密)

9 开始写登陆接口

//登陆 
router.post('/login',async(req,res)=>{
    const user = userModel.findOne({
        username:req.body.username
    })
    if(!user){
        // 如果是false,查不到用户 进入
        return res.status(422).send({message:"用户名不存在"})
    }
    const passwordIsTrue = require('bcrypt').compareSync(req.body.username,user.password) // 比较加密密码和不加密密码
    if(!passwordIsTrue){
        // 如果是false 就密码错误 进入
        return res.status(422).send({message:"用户名密码错误"})
    }
    // jsonwebtoken 设置token
    const jwt = require('jsonwebtoken')
    const token jwt.sign({id:user._id},key) // 一般都是_id key为密钥,一般放到全局的忽略文件里 不能泄露
    res.send({
        token,
        create_time:new Date(),
        user
		})
 })

10 userInfo用户信息

router.get('/userInfo',async (req,res)=>{
   const userToken =  req.headers.authorization.split(' ').pop() // 获取到前端存储的token
   const IsTokenTrue = jwt.verify(userToken,key) // 校验成功会返回{id:'asdasdasdas',is:123},
   const {id} = IsTokenTrue // 解构
   const data = awite userInfoModel.find({_id:id}) // 查找
   res.send(data) // 发送数据
})

提示

jwt.verify在校验的时候也会将引号也校验,注意...自己在代码里测试http的时候千万注意,翻车了一会.....

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-01-14 02:03:13  更:2022-01-14 02:04:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 14:09:36-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码