node.js(express.js)+mysql实现登录功能

这篇具有很好参考价值的文章主要介绍了node.js(express.js)+mysql实现登录功能。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

实现步骤

1.检测表单数据是否合法
2.根据用户名查询用户的数据
3.判断用户输入的密码是否正确
4.生成JWT 的 Token 字符串


登录接口完整代码如下:controllers/user.js文件

// 登录接口
var db = require("../utils/db");
// 导入密码加密
const bcrypt = require("bcryptjs");
// 导入jwt 包来生成token
const jwt = require("jsonwebtoken");
// 导入密钥
const config = require("../config");
exports.login = (req, res) => {
  // 获取客户端提交到服务器的用户信息
  const userinfo = req.body;
  // 定义sql语句,根据用户名查询用户的信息
  const sql = `select * from ev_users where username=?`;
  // 执行sql语句,根据用户名查询用户的信息
  db.query(sql, userinfo.username, (err, results) => {
    // 执行sql语句失败
    if (err) return res.cc(err);
    // 执行sql语句成功,但是获取到的数据条件不等于1
    if (results.length !== 1) return res.cc("登录失败!");
    // 判断密码是否和数据库中的密码是否一致
    // compareSync 第一个参数用户输入的,第二个参数数据库查询到的
    // 返回值为ture 一致,反之
    const compareResult = bcrypt.compareSync(
      userinfo.password,
      results[0].password
    );

    console.log("1", userinfo.password);
    console.log("2", results[0].password);
    if (!compareResult) {
      return res.cc("登录失败233");
    }
    // 生成jwt的token字符串
    // 清空用户信息的密码和头像
    const user = { ...results[0], password: "", user_pic: "" };
    console.log(user);
    // 对用户的信息进行加密,生成token字符串
    const tokenStr = jwt.sign(user, config.jwtSecretKey, {
      expiresIn: "10h", // token 有效期为10小时
    });

    // 将生成的token字符串响应给客户端
    res.send({
      status: 0,
      message: "登录成功!",
      // 为了方便客户端使用,在服务器端直接拼接上Bearer的前缀
      // 注意:Bearer 后面必须有空格
      token: "Bearer "+ tokenStr,
    });
    // res.cc("ok");
  });
};

实现步骤

一、检测登录表单的数据是否合法

1)安装 jOi 包,为表单中携带的每个数据项,定义验证规则:

npm install joi

(2)安装 @escook/express-j01 中间件,来实现自动对表单数据进行验证的功能:

npm install @escook/express-joi
(3)新建schema/user.js
// 导入定义验证规则的包
// const joi = require("@hapi/joi");
const joi = require("joi");
/**
 * string()值必须是字符串
 * alphanum()值只能包含a-zA-ZO-9的字符串
 * min(length) 最小长度
 * max(length) 大长度
 * required() 值是必填项,不能为 undefined
 * pattern(正则表达式) 值必须符合正则表达式的规则
 */

// 定义用户名和密码的验证规则
const username = joi.string().alphanum().min(1).max(10).required();
const password = joi
  .string()
  .pattern(/^[\S]{6,12}$/)
  .required();
// 定义验证注册和登录表单数据的规则对象
exports.reg_login_schema = {
  body: {
    username,
    password,
  },
};
(4)在routes/use.js中引入schema/user.js中的方法reg_login_schema,代码如下:
var express = require("express");
var router = express.Router();
// 引入封装的获取验证码的方法
var unr_handler = require("../controllers/user");

// 1.导入验证数据的中间件
const expressJoi = require("@escook/express-joi");
//  2.导入需要的验证规则对象
const { reg_login_schema } = require("../schema/user");

// 新用户注册
// router.post("/regUser", expressJoi(reg_login_schema), unr_handler.regUser);
// router.post("/regUser", unr_handler.regUser);
// 登录
router.post("/login", expressJoi(reg_login_schema), unr_handler.login);
module.exports = router;

二、根据用户名查询用户的数据

var db = require("../utils/db");
// 导入密码加密
const bcrypt = require("bcryptjs");
// 导入jwt 包来生成token
const jwt = require("jsonwebtoken");
// 导入密钥
const config = require("../config");
// 登录接口
exports.login = (req, res) => {
  // 获取客户端提交到服务器的用户信息
  const userinfo = req.body;
  // 定义sql语句,根据用户名查询用户的信息
  const sql = `select * from ev_users where username=?`;
  // 执行sql语句,根据用户名查询用户的信息
  db.query(sql, userinfo.username, (err, results) => {
    // 执行sql语句失败
    if (err) return res.cc(err);
    // 执行sql语句成功,但是获取到的数据条件不等于1
    if (results.length !== 1) return res.cc("登录失败!");
    // res.cc("ok");
  });
};

三、判断用户输入的密码是否正确

// 导入密码加密
const bcrypt = require("bcryptjs");
exports.login = (req, res) => {
  // 获取客户端提交到服务器的用户信息
  const userinfo = req.body;
  // 定义sql语句,根据用户名查询用户的信息
  const sql = `select * from ev_users where username=?`;
  // 执行sql语句,根据用户名查询用户的信息
  db.query(sql, userinfo.username, (err, results) => {
    // 执行sql语句失败
    if (err) return res.cc(err);
    // 执行sql语句成功,但是获取到的数据条件不等于1
    if (results.length !== 1) return res.cc("登录失败!");
    // 判断密码是否和数据库中的密码是否一致
    // compareSync 第一个参数用户输入的,第二个参数数据库查询到的
    // 返回值为ture 一致,反之
    const compareResult = bcrypt.compareSync(
      userinfo.password,
      results[0].password
    );
    console.log("1", userinfo.password);
    console.log("2", results[0].password);
    if (!compareResult) {
      return res.cc("登录失败233");
    }
    // res.cc("ok");
  });
};

四、生成JWT 的 Token 字符串

1)在生成 Token 字符串的时候,一定要别除 密码 和 头像 的值

  // 清空用户信息的密码和头像
    const user = { ...results[0], password: "", user_pic: "" };

2)安装成成token的字符串包

npm 1 jsonwebtoken@8.5.1

3)在 /controllers/user.js 模块的头部区域,导入 jsonwebtoken 包:

// 导入jwt 包来生成token
const jwt = require("jsonwebtoken");

4)创建 config.js 文件,并向外共享加密和还原Token 的 jwtSecretKey 字符串:

// 全局的配置文件
module.exports = {
  // 加密和解密 token 的密钥
  jwtSecretKey: "itheima No1. ^_^",
};

5)将用户信息对象加密成 Token 字符串, 在controllers/user.js文件引入config.js

// 导入密钥
const config = require("../config");
const user = { ...results[0], password: "", user_pic: "" };
    console.log(user);
    // 对用户的信息进行加密,生成token字符串
    const tokenStr = jwt.sign(user, config.jwtSecretKey, {
      expiresIn: "10h", // token 有效期为10小时
    });
       // 将生成的token字符串响应给客户端
    res.send({
      status: 0,
      message: "登录成功!",
      // 为了方便客户端使用,在服务器端直接拼接上Bearer的前缀
      token: "Bearer"+ tokenStr,
    });

最终登录接口代码如下:

// 登录接口
var db = require("../utils/db"); 
// 导入密码加密
const bcrypt = require("bcryptjs");
// 导入jwt 包来生成token
const jwt = require("jsonwebtoken");
// 导入密钥
const config = require("../config");
exports.login = (req, res) => {
  // 获取客户端提交到服务器的用户信息
  const userinfo = req.body;
  // 定义sql语句,根据用户名查询用户的信息
  const sql = `select * from ev_users where username=?`;
  // 执行sql语句,根据用户名查询用户的信息
  db.query(sql, userinfo.username, (err, results) => {
    // 执行sql语句失败
    if (err) return res.cc(err);
    // 执行sql语句成功,但是获取到的数据条件不等于1
    if (results.length !== 1) return res.cc("登录失败!");
    // 判断密码是否和数据库中的密码是否一致
    // compareSync 第一个参数用户输入的,第二个参数数据库查询到的
    // 返回值为ture 一致,反之
    const compareResult = bcrypt.compareSync(
      userinfo.password,
      results[0].password
    );

    console.log("1", userinfo.password);
    console.log("2", results[0].password);
    if (!compareResult) {
      return res.cc("登录失败233");
    }
    // 生成jwt的token字符串
    // 清空用户信息的密码和头像
    const user = { ...results[0], password: "", user_pic: "" };
    console.log(user);
    // 对用户的信息进行加密,生成token字符串
    const tokenStr = jwt.sign(user, config.jwtSecretKey, {
      expiresIn: "10h", // token 有效期为10小时
    });

    // 将生成的token字符串响应给客户端
    res.send({
      status: 0,
      message: "登录成功!",
      // 为了方便客户端使用,在服务器端直接拼接上Bearer的前缀
      // 注意:Bearer 后面必须有空格
      token: "Bearer "+ tokenStr,
    });
    // res.cc("ok");
  });
};

/utils/db文件代码

const mysql = require("mysql");
const db = mysql.createPool({
  host: "localhost", // 连接地址
  port: "3306", //端口号
  user: "root", //用户名
  password: "XXXXXXX", //密码
  database: "exapp2", //数据库名
});
module.exports = db;

node.js(express.js)+mysql实现登录功能,node.js,node.js,express,javascript

五、在app.js中注册路由之前,配置解析token的中间件,为了指定那些接口不需要进行Token 的身份认证

1.安装解析 Token 的中间件:

npm i express-jwt@5.3.3

2). app.js

// 导入配置文件
const config = require("./config");
// 解析token的中间件
const expressJWT = require("express-jwt");
// 使用 unless({ path:[/^\/user\//] )) 指定哪些接口不需要进行 Token 的身份认证
// ps: path: [/^\/user/] 改成你自己的接口前缀path: [/^\/XXX/] 
app.use(
  expressJWT({ secret: config.jwtSecretKey }).unless({ path: [/^\/user/] })
);

3)在 app.js 中的 错误级别中间件 里面,捕获并处理 Token 认证失败后的错误:文章来源地址https://www.toymoban.com/news/detail-804658.html

// 定义表单验证失败的错误的中间件,并把验证失败的结果响应给客户端
// 错误中间件
app.use(function (err, req, res, next) {
  // 数据验证失败,instanceof判断
  if (err instanceof joi.ValidationError) {
    return res.cc(err);
  }
  // token身份认证失败后的错误
  if (err.name === "UnauthorizedError") return res.cc("身份认证失败");
  // 未知错误
  res.cc(err);
});

到了这里,关于node.js(express.js)+mysql实现登录功能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Node.js npm V8 React Express的运行配合关系:构建JavaScript应用的基石

    目录 Node.js 和 V8 引擎 Node.js 和 npm LTS(Long Term Support) React Node.js的作用 Express Node.js 和 V8 引擎 Node.js 使用 Google 的 V8 JavaScript 引擎 来执行 JavaScript 代码。V8 是一个高性能的 JavaScript 和 WebAssembly 引擎,用于在 Google Chrome 浏览器和 Node.js 中运行 JavaScript。 V8 引擎的更新 通常包括

    2024年03月12日
    浏览(45)
  • Express.js实现注册和登录

     注册接口 注册接口,用户提供必要的注册信息(如用户名和密码),服务器对用户进行验证并创建用户账号 登录接口 登录接口,用户提供登录凭据(如用户名和密码),服务器验证凭据的正确性并颁发访问令牌 校验接口  校验登录状态,服务器将校验请求中的登录凭据(

    2024年02月22日
    浏览(30)
  • node.js(expree.js )模拟手机验证码功能及登录功能

    dbconfig.js 测试验证码发送 测试登录

    2024年01月19日
    浏览(27)
  • Node + Express 后台开发 —— 登录标识

    系统通常只有登录成功后才能访问,而 http 是无状态的。倘若直接请求 需要登录 才可访问的接口,假如后端反复查询数据库,而且每个请求还得带上用户名和密码,这都是不很好。 作为前端,我们听过 cookie (session) 和 token ,他们都是 登录标识 ,各有特色,本篇都将完整实

    2024年02月02日
    浏览(23)
  • uniapp+node.js+mysql前后端微信小程序授权登录

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 目录 文章目录 前言 一、前端代码? 1.微信授权登录的页面(没有样式,自己写) 2.”我的“页面 3.封装request.js的页面 4.vuex的状态管理的页面 5.添加了识别有放token的没有登录就自动跳转登录

    2024年02月09日
    浏览(37)
  • 基于NodeJs+Express+MySQL 实现实现登录注册接口+token生成与解析验证+跨域-CORS

    目录 一、express是什么? 二、安装 express 三、安装Mysql 四、安装 nodemon 实现项目热更新 五、这里先了解下express的post get delete接口 post接口说明: get接口说明 :  DELETE 接口 六、注册功能 1、流程分析 校验表单数据是否合法 检测用户名是否占用 密码加密处理 插入新用户 2、

    2024年02月11日
    浏览(33)
  • 完成一个有趣的Web期末大作业(html、css、javascript、MySQL、Node.js)

    题目:学校老师的要求很开放,要自己做一个感兴趣的网页,要求使用基础的html、css和javascript,后端要使用数据库。 网上都是各种管理系统,看多了觉得没啥意思,要做一个自己感兴趣的网站。近几年沉迷犬夜叉这部动漫,就花了两天的时间创建了一个犬夜叉的网站,对于

    2024年02月04日
    浏览(35)
  • 09-Node.js—express框架

    express 是一个基于 Node.js 平台的极简、灵活的 WEB应用开发框架,官方网址:https://www.expressjs.com.cn/ 简单来说,express 是一个封装好的工具包,封装了很多功能,便于我们开发 WEB 应用(HTTP 服务) 大家都应该玩过我的世界,在我的世界中如果纯靠手去砍树或者挖矿,效率是很低

    2023年04月26日
    浏览(32)
  • node.js中Express简介

    1.什么是Express 官方给出的概念:Express是基于Node.js平台,快速、开放、极简的web开发框架。 通俗理解:Express的作用和Node.js内置的http模块类似,是 专门用来创建web服务器的 Express的本质:就是一个npm上的第三方包,提供了快速创建Web服务器的便捷方法 2.进一步理解Express htt

    2024年02月08日
    浏览(42)
  • Node.js之express框架学习心得

    Node.js是基于Chrome V8引擎构建的JavaScript运行时,它采用了完全不同的开发模型。Node.js使用事件驱动和非阻塞I/O的方式处理请求,通过单线程和异步机制,实现高效的并发处理。这意味着在Node.js中,一个线程可以处理数千个并发连接,大大提高了服务器的性能和可伸缩性。 4

    2024年02月14日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包