node入门(一)bcrypt密码加密和验证

2023-11-03

前言:node.js越来越被广泛的使用,现在找工作职位要求上大都写熟悉或了解一门后端 语言,如(java、php、node等)。Node.js是一个javascript运行环境。它让javascript可以开发后端程序,实现几乎其他后端语言实现的所有功能,Nodejs语法完全是js语法,只要你懂js基础就可以学会Nodejs后端开发,Node打破了过去JavaScript只能在浏览器中运行的局面。前后端编程环境统一,可以大大降低开发成本,也降低了学习成本。

一.安装koa

1.什么是koa?

Koa即KoaJS,Koa:基于 Node.js 平台的下一代 web 开发框架。
Koa 是一个新的 web 框架,由 Express 幕后的原班人马打造, 致力于成为 web 应用和 API 开发领域中的一个更小、更富有表现力、更健壮的基石。 通过利用 async 函数,Koa 帮你丢弃回调函数,并有力地增强错误处理。

Koa官网地址:https://koa.bootcss.com/
2…新建文件serves,初始化项目

npm init -y

3…安装koa模块

npm install koa --save

二.运行本地项目

1.在文件下新建index.js

	// 导入koa模块
    const Koa = require('koa');
    // 创建koa的实例app
    const app = new Koa();

    app.use(async ctx => {
        ctx.body = "<h1>hello koa</h1>"
    })
    // 监听端口
    app.listen(3000, () => {
        console.log("服务器已启动,http://localhost:3000");
    })

2.使用node命令启动服务器(电脑上要安装node),并在浏览器打开3000端口

// 进入当前文件夹
node index.js

在这里插入图片描述

三.安装mongoose

npm install mongoose --save

四.安装mongodb

查看link
使用mongodb compass,可以对mongoDB数据可视化(window)
安装网址:link
配置mongodb,点击电脑右键属性 =》 高级系统设置 =》环境变量 =》 点击path =》 新建变量,将安装的mongodb的路径添加确定,mongodb路径(C:\Program Files\MongoDB\Server\4.0\bin)一般是这个路径
配置好后运行mongod就可以运行打开数据库了。

五.连接数据库

1.新建schema文件,在该文件下新建Uers.js文件

const mongoose = require("mongoose");
const Schema = mongoose.Schema;
let ObjectId = Schema.Types.ObjectId;

//创建UserShema
const userSchema = new Schema({
  userId: { type: ObjectId },
  username: { unique: true, type: String },
  password: String,
  createdAt: { type: Date, default: Date.now() },
  lastLonginAt: { type: Date, default: Date.now() },
});

// 发布模型
mongoose.model("User", userSchema);

2.连接数据库
新建init.js,连接数据库,安装glob(作用:node的glob模块允许你使用 *等符号, 来写一个glob规则,像在shell里一样,获取匹配对应规则的文件)

npm install glob --save

const mongoose = require("mongoose");
const db = "mongodb://localhost/smile-db"; // 数据库名称smile-db
const glob = require("glob");
const { resolve } = require("path");

exports.initSchemas = () => {
  glob.sync(resolve(__dirname, "./schema", "**/*.js")).forEach(require);
};

exports.connect = () => {
  // 连接数据库
  //{ useNewUrlParser: true, useUnifiedTopology: true }
  mongoose.connect(db, { useNewUrlParser: true, useUnifiedTopology: true });
  let maxConnectTimes = 0; //重连次数

  return new Promise((resolve, reject) => {
    mongoose.connection.on("disconnected", () => {
      console.log("-----------------数据库断开");
      if (maxConnectTimes <= 3) {
        maxConnectTimes++;
        mongoose.connect(db);
      } else {
        reject();
        throw new Error("数据库出现错误,请手动解决");
      }
    });

    mongoose.connection.on("error", () => {
      console.log("------------数据库错误----");
      if (maxConnectTimes <= 3) {
        maxConnectTimes++;
        mongoose.connect(db);
      } else {
        reject();
        throw new Error("数据库出现错误,请手动解决");
      }
    });

    //数据库连接成功
    mongoose.connection.once("open", () => {
      console.log("------------数据库连接成功");
      resolve();
    });
  });
};

3.执行,在index.js引入init.js函数

const Koa = require("koa");
const app = new Koa();
const { connect, initSchemas} = require("./databse/init.js");
const mongoose = require("mongoose");

//立即执行函数
 (async () => {
  await connect();
  initSchemas()
 })();

app.use(async (ctx) => {
  ctx.body = "<h1>hello koa</h1>";
});

app.listen(3000, () => {
  console.log("端口打开成功");
});

运行后可以看到控制台显示数据库连接成功

六.加密密码

1.连接数据库,写入数据(index.js)

(async () => {
  await connect();
  initSchemas();
  const User = mongoose.model("User");
  let oneUser = new User({
    username: "admin121212",
    password: "98652222",
  });
  oneUser.save().then(() => {
    console.log("插入成功");
  });
})();

运行命令node index.js
在这里插入图片描述
打开mongodb compass程序,在smile-db数据库下有users的表(上面我写的是连接user表,但是默认加了s,不要加s可以自行配置)
2.加密密码,安装bcrypt

npm install bcrypt --save

//在user.js文件中引入,
const mongoose = require("mongoose");
const Schema = mongoose.Schema;
let ObjectId = Schema.Types.ObjectId;

const bcrypt = require("bcrypt");
// 加密的幂次
let SALT_WORK_FACTOR = 10; // 默认 10

//创建UserShema
const userSchema = new Schema({
  userId: { type: ObjectId },
  username: { unique: true, type: String },
  password: String,
  createdAt: { type: Date, default: Date.now() },
  lastLonginAt: { type: Date, default: Date.now() },
});

userSchema.pre("save", function (next) {
  console.log("写入操作......");
  bcrypt.genSalt(SALT_WORK_FACTOR, (err, salt) => {
    if (err) return next(err);
    bcrypt.hash(this.password, salt, (err, hash) => {
      if (err) return next(err);
      this.password = hash;
      next();
    });
  });
});

// 发布模型
mongoose.model("User", userSchema);

保存运行并没有写入成功,因为我配置了写入时账户不能重复,所以要更改账户名(username),再次运行,没有写入成功也没有报错,版本是4.0.1,我以为是版本的问题(我也没有测试低版本的),后面查阅了资料,再次确认我没有写错,后来找到问题,window要先安装node-gyp

npm install --save node-gyp

npm install --save  bcryptjs

安装成功后引入 bcryptjs,运行,可以看到密码已经加密
在这里插入图片描述

七.账户密码验证

1.封装方法验证密码
在user.js文件中.

const mongoose = require("mongoose");
const Schema = mongoose.Schema;
let ObjectId = Schema.Types.ObjectId;
const bcrypt = require("bcryptjs");
// 加密的幂次
let SALT_WORK_FACTOR = 10; // 默认 10

//创建UserShema
const userSchema = new Schema({
  userId: { type: ObjectId },
  username: { unique: true, type: String },
  password: String,
  createdAt: { type: Date, default: Date.now() },
  lastLonginAt: { type: Date, default: Date.now() },
});

userSchema.pre("save", function (next) {
  console.log("写入操作......");
  bcrypt.genSalt(SALT_WORK_FACTOR, (err, salt) => {
    if (err) return next(err);
    bcrypt.hash(this.password, salt, (err, hash) => {
      if (err) return next(err);
      this.password = hash;
      next();
    });
  });
});

userSchema.methods = {
  comparePassword: (_pass, password) => { //验证方法
    // _pass传递过来的密码,password是数据库中的密码
    return new Promise((res, rej) => {
      bcrypt.compare(_pass, password, (err, isMath) => { //compare官方方法
        if (!err) {
          res(isMath); // isMath返回true和false,true代表验证通过
        } else {
          rej(err);
        }
      });
    });
  },
};

// 发布模型
mongoose.model("User", userSchema);

2.填写登录和密码
我这边没有写前台,只能手动写账户和密码到 数据库验证(index.js)

const Koa = require("koa");
const app = new Koa();
const { connect, initSchemas } = require("./databse/init.js");
const mongoose = require("mongoose");

//立即执行函数
(async () => {
  await connect();
  initSchemas();

  const User = mongoose.model("User");

//模拟用户登录账户输入的账户面
  let username = "admin"; 
  let pass = "789456123"; // 这个密码是没有的

  await User.findOne({ username: username })
    .exec()
    .then(async (data) => {
      console.log(data, "数据库里面的数据");
      if (data) { // 因为我上面插入数据库的时候设置了账户名不能重复
        let newUser = new User();
        await newUser
          .comparePassword(pass, data.password)
          .then((isMath) => {
            if (isMath) { // 返回true账户密码存在
              console.log("用户名密码存在............");
            } else { // 否则是账户存在密码错误
              console.log(isMath, "密码不存在............");
            }
          })
          .catch((error) => {
            console.log("服务器出现异常,请重启服务器......");
          });
      } else {// 账户名不存在
        console.log("用户名密码不存在");
      }
    })
    .catch((error) => {
      console.log(error, "出现错误...");
    });
})();

app.use(async (ctx) => {
  ctx.body = "<h1>hello koa</h1>";
});

app.listen(3000, () => {
  console.log("端口打开成功");
});

mongodb数据库中的数据


运行文件,node index.js

在文件中写入对应的账户密码运行则:


查询成功,我这边没有写前台,但是原理还是一样的,拿到前台登录的数据再进行比对。

掘金网址:https://juejin.im/post/5e8fd098f265da47eb059c8a
写的不足,持续更新中…

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

node入门(一)bcrypt密码加密和验证 的相关文章

随机推荐

  • equals方法该怎么重写呢

    关于equals方法的重写 在编写代码的时候 我们总是会需要重写equals代码 因为equals代码没有重写的时候比较的是两个对象的内存地址 而两个代码的内存地址不同 答案肯定返回false 这并不是我们希望看到的 因此要重写equals
  • Java回调函数详解

    什么是回调函数 CallBack 在编写程序时 有时候会调用许多API中实现实现的函数 但某些方法需要我们传入一个方法 以便在需要的时候调用我们传入进去的函数 这个被传入的函数称为回调函数 Callback function 打个比方 有一
  • Visual Studio Code 配置java开发环境

    最近在学习算法 有时需要在自己的机器上调试一下代码 有些算法题目的题解是用java编的 因为这类代码只是单个的java文件 所以不想动用MyEclipse那样的重型工具 正好机器上有一个轻量级的VS Code 我就试着在上面搭了一个java
  • windows上的linux子系统(WSL)

    目录 一 介绍 二 原理 2 1 wsl组件 2 2 wsl运行过程 2 3 文件系统 2 4 禁忌 三 使用 3 1 安装 3 2 用户账户和权限 3 3 wsl管理 3 3 互操作 参考 推荐阅读 一 介绍 Windows Subsys
  • 时间对象new Date 以及中国标准时间与时间戳,标准时间之间的转换

  • C语言程序设计大作业——员工管理系统(代码超详细内含实验报告)

    写在前面 欢迎来到 发奋的小张 的博客 我是小张 一名普通的在校大学生 在学习之余 用博客来记录我学习过程中的点点滴滴 也希望我的博客能够更给同样热爱学习热爱技术的你们带来收获 希望大家多多关照 我们一起成长一起进步 也希望大家多多支持我鸭
  • 基于BP神经网络的回归预测

    基本概念 误差反向传播神经网络简称为BP Back Propagation 网络 它是一种具有三层或三层以上的多层神经网络 每一层都由若干个神经元组成 如图所示为一个BP神经网络的结构图 它的左 右各层之间各个神经元实现全连接 即左层的每一
  • LINUX下搭建JAVA的开发环境

    1 Linux下JDK的安装 至于下载JDK的二进制可执行文件 这里就不讲了 大家直接到官方网去下载就可以了 1 我下载下来的JDK安装文件名称为 jdk 1 5 0 14 linux i586 rpm bin 我把它保存在 tools目录
  • el search 条件更新

    from elasticsearch import Elasticsearch es Elasticsearch 192 168 55 90 9200 updateBody query bool must wildcard fileName
  • esxi管理端口_VMWare Esxi 基于NAT的管理端口转发

    上一篇关于WMWare Esxi的文章介绍了在多台虚拟机之间用软路由共享一个IP的情况 VMWare Esxi 海蜘蛛配置NAT共享IP上网 其中用了两个IP 一个用于虚拟机上网 一个用于Management Network 但是在只有一个
  • R语言 数据导出和导入 csv tsv xls xlsx

    R语言 Excel 导出为Excel的xls xlsx 导出数据 write table data2 file train1 xls sep t row names TRUE col names TRUE quote TRUE write
  • Promise的理解和使用

    一 Promise 是什么 1 理解 Promise是一门新的技术 ES6规范 Promise是JS中进行异步编程的新解决方案 旧方案是使用回调函数 Promise是一个构造函数 Promise对象用来封装一个异步操作并可以获取其成功 失败
  • 使用 Docker 部署 Prometheus + Grafana 监控平台

    使用 Docker 部署 Prometheus Grafana 监控平台 默认docker 已经安装好 我使用的是CentOS7 注意一定要开启服务器对应的端口 1 安装Prometheus docker run itd name prom
  • Windows虚拟机激活

    打开cmd命令提示符 首先连接kms服务器 slmgr skms skms netnr eu org 接着输入对应系统版本的产品密钥 xxxxx xxxxx xxxxx xxxxx xxxxx slmgr ipk xxxxx xxxxx x
  • 【DEBUG】MoviePy couldn't find the codec associated with the filename.Provide the 'codec' parameter

    问题描述 ValueError MoviePy couldn t find the codec associated with the filename Provide the codec parameter in write videof
  • __weak详解

    object默认的修饰符是 strong 然而在开发中我们也经常使用 weak 用它来解决循环引用的问题 两个对象相互引用无法释放 造成内存泄露 用 weak来破坏一个强引用 来达到正常释放的目的 这种情况常见于block中 但是有没有想过
  • linux驱动面试题2018

    linux驱动面试题2018 面试题整理 含答案 版权声明 本文为博主原创文章 未经博主允许不得转载 转载请标明原址 https blog csdn net kai zone article details 82021233 前言 这篇文章
  • Camera:高斯模糊

    高斯模糊场景 手机相机不同于工业相机以及车载相机 手机相机的模式切换往往会伴随着预览分辨率的改变 而分辨率的切换伴随手机App gt Framework gt HAL gt Drivel一层层的下发上传 所造成的时间延迟已经带来了不可忽略的
  • Elasticsearch数据刷新策略RefreshPolicy简述

    说明 默认情况下ElasticSearch索引的refresh interval为1秒 这意味着数据写1秒才就可以被搜索到 每次索引refresh会产生一个新的 lucene 段 这会导致频繁的 segment merge 行为 对系统 C
  • node入门(一)bcrypt密码加密和验证

    前言 node js越来越被广泛的使用 现在找工作职位要求上大都写熟悉或了解一门后端 语言 如 java php node等 Node js是一个javascript运行环境 它让javascript可以开发后端程序 实现几乎其他后端语言实