node.js(express.js)+mysql实现注册功能

文章目录

  • 实现步骤
  • 一、获取客户端提交到服务器的用户信息,对表单中的数据,进行合法性的效验 代码如下:
  • 二、检测用户名是否被占用
  • 三、对密码进行加密
  • 四、插入新用户(完整代码)
  • 总结


实现步骤

一、获取客户端提交到服务器的用户信息,对表单中的数据,进行合法性的效验 代码如下:

// 注册新用户的接口
exports.regUser = (req, res) => {// 获取客户端提交到服务器的用户信息const userinfo = req.body;// 对表单中的数据,进行合法性的效验,如果有一项为空if (!userinfo.username || !userinfo.password) {return res.send({status: 1,message: "用户名或密码不合法",});}console.log(userinfo);
};

二、检测用户名是否被占用

/utils/db.js文件的代码如下:

const mysql = require("mysql");
const db = mysql.createPool({host: "localhost", // 连接地址port: "3306", //端口号user: "root", //用户名XXXXXXXXpassword: "XXXXXXXX", //密码database: "exapp2", //数据库名
});
module.exports = db;
var db = require("../utils/db");
// 注册新用户的接口
exports.regUser = (req, res) => {// 获取客户端提交到服务器的用户信息const userinfo = req.body;// 对表单中的数据,进行合法性的效验,如果有一项为空if (!userinfo.username || !userinfo.password) {return res.send({status: 1,message: "用户名或密码不合法",});}// 检验用户名是否被占用// 定义sql语句,查询用户名是否被占用var sql = `select * from ev_users where username=?`;db.query(sql, userinfo.username, (err, data) => {// 执行sql语句失败,if (err) {return res.send({status: 1,message: err.message,});}// 判断用户名是否被占用,data.length 大于0说明sql语句查到了该用户名,所以已定被占用if (data.length > 0) {// console.log("用户名被占用吗,请更换其他用户名");return res.send({status: 1,message: "用户名被占用吗,请更换其他用户名",});}//  res.send("ok");});console.log(userinfo);
};

三、对密码进行加密

项目安装指定版本bcryptjs库

 npm i bcryptjs@2.4.3
var db = require("../utils/db");
// 导入密码加密
const bcrypt = require("bcryptjs");
// 注册新用户的接口
exports.regUser = (req, res) => {// 获取客户端提交到服务器的用户信息const userinfo = req.body;// 对表单中的数据,进行合法性的效验,如果有一项为空if (!userinfo.username || !userinfo.password) {return res.send({status: 1,message: "用户名或密码不合法",});}// 检验用户名是否被占用// 定义sql语句,查询用户名是否被占用var sql = `select * from ev_users where username=?`;db.query(sql, userinfo.username, (err, data) => {// 执行sql语句失败,if (err) {return res.send({status: 1,message: err.message,});}// 判断用户名是否被占用,data.length 大于0说明sql语句查到了该用户名,所以已定被占用if (data.length > 0) {// console.log("用户名被占用吗,请更换其他用户名");return res.send({status: 1,message: "用户名被占用吗,请更换其他用户名",});}// 用户名可以使用,对密码进行加密// bcrypt.hashSync(客户端明文密码,10) // 第二个参数提高密码的安全性userinfo.password = bcrypt.hashSync(userinfo.password, 10);//console.log("@", userinfo.password);//  res.send("ok");});console.log(userinfo);
};

四、插入新用户(完整代码)

var db = require("../utils/db");
// 导入密码加密
const bcrypt = require("bcryptjs");
// 注册新用户的接口
exports.regUser = (req, res) => {// 获取客户端提交到服务器的用户信息const userinfo = req.body;// 1.对表单中的数据,进行合法性的效验,如果有一项为空if (!userinfo.username || !userinfo.password) {return res.send({status: 1,message: "用户名或密码不合法",});}// 2.检验用户名是否被占用// 定义sql语句,查询用户名是否被占用var sql = `select * from ev_users where username=?`;db.query(sql, userinfo.username, (err, data) => {// 执行sql语句失败,if (err) {return res.send({status: 1,message: err.message,});}// 判断用户名是否被占用,data.length 大于0说明sql语句查到了该用户名,所以已定被占用if (data.length > 0) {// console.log("用户名被占用吗,请更换其他用户名");return res.send({status: 1,message: "用户名被占用吗,请更换其他用户名",});}// 3.用户名可以使用,对密码进行加密// bcrypt.hashSync(客户端明文密码,10) // 第二个参数提高密码的安全性userinfo.password = bcrypt.hashSync(userinfo.password, 10);// 4.插入新用户// 定义插入新用户的sql语句let sql1 = "insert into ev_users set ?";// 调用db.query()执行sql语句db.query(sql1,{ username: userinfo.username, password: userinfo.password,},function (err, data) {// 判断sql语句是否执行成功if (err) {return res.send({ status: 1, message: err.message });}// 判断影响行数是否为1if (data.affectedRows !== 1) {return res.send({ status: 1, message: "注册用户失败,请稍后再试" });}//注册成功res.send({ status: 0, message: "注册成功!" });});//  res.send("ok");});console.log(userinfo);
};

在这里插入图片描述

总结

再插入新用户时输入中文username mysql会 出现字符集不匹配的情况
报错情况如下:
ER_CANT_AGGREGATE_2COLLATIONS: Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation ‘=’
原因: mysql数据库建表的时候采用的是latin的字符集,而网页中查询的是utf-8

解决方法:在你自己的数据库中分别执行一下sql

SET collation_connection = 'utf8_general_ci'

ps: your_database_name为你自己的数据库名称,
your_table_name为你自己的表的名称

ALTER DATABASE your_database_name CHARACTER SET utf8 COLLATE utf8_general_ciALTER TABLE your_table_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/240358.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序canvas画布图片保存到相册官方授权、自定义授权、保存

关键步骤介绍 wx.getSetting可以获取授权信息。 wx.authorize首次授权时会打开弹框让用户授权,若用户已选择同意或拒绝,后续不会再显示授权弹框。 如果授权信息显示未进行相册授权,则打开自定义弹框(show_auth: true&#xff0…

[Python练习]使用Python爬虫爬取豆瓣top250的电影的页面源码

1.安装requests第三方库 在终端中输入以下代码(直接在cmd命令提示符中,不需要打开Python) pip install requests -i https://pypi.douban.com/simple/ 从豆瓣网提供的镜像网站下载requests第三方库 pip install requests 是从国外网站下…

深度学习记录--梯度消失和爆炸

梯度消失和爆炸的产生 当神经网络层数很大时&#xff0c;即很大时&#xff0c;w与1之间的大小关系会产生梯度消失与梯度爆炸的问题 当w<1时&#xff0c;会非常小&#xff0c;梯度消失 当w>1时&#xff0c;会非常大&#xff0c;梯度爆炸 解决方法 权重初始化 层数n越大…

一、Flask学习之HTML

一、Flask学习之HTML 1.运行简单页面 首先需要搭建环境&#xff1a; pip install flaskfrom flask import Flaskapp Flask(__name__)# 创建了网址 /show/info 和函数index之间的对应关系&#xff0c;以后用户在浏览器上访问/show/info&#xff0c;网站自动执行index函数 ap…

创建审批流程极简培训教程

流程审批创建指导文档 本文档适用于使用快速了解审批流程的概念&#xff0c;以钉钉流程创建为例&#xff0c;构建极简指导&#xff0c;因为很多人对于这些术语不够熟悉&#xff0c;也很难在很短的时间成为专家&#xff0c;那么使用此文档&#xff0c;很快上手。 概念澄清 需要…

跟着cherno手搓游戏引擎【8】按键和鼠标的KeyCode

自定义KeyCode 先把glfw3.h里的KeyCode的定义抄到咱这里来。 在YOTO下创建KeyCode.h: #pragma once#ifdef YT_PLATFORM_WINDOWS///从glfw3中拿的 #define YT_KEY_SPACE 32 #define YT_KEY_APOSTROPHE 39 /* */ #define YT_KEY_COMMA 44…

【深度强化学习】目前落地的挑战与前沿对策

到目前为止&#xff0c;深度强化学习最成功、最有名的应用仍然是 Atari 游戏、围棋游戏等。即使深度强化学习有很多现实中的应用&#xff0c;但其中成功的应用并不多。为什么呢&#xff1f;本文总结目前的挑战。 目录 所需的样本数量太大探索阶段代价太大超参数的影响非常大稳定…

Luckysheet类似excel的在线表格(vue)

参考文档&#xff1a;快速上手 | Luckysheet文档 一、引入 在vue项目的public文件夹下的index.html的<head>标签里面引入 <link relstylesheet hrefhttps://cdn.jsdelivr.net/npm/luckysheetlatest/dist/plugins/css/pluginsCss.css /><link relstylesheet hre…

C++PythonC# 三语言OpenCV从零开发(1):环境配置

文章目录 前言课程选择环境配置PythonC#COpenCV官网下载新建C项目测试运行Csharp版Python版 gitee仓库总结 前言 由于老王我想转机器视觉方向的上位机行业&#xff0c;我就打算开始从零学OpenCV。但是目前OpenCV有两个官方语言&#xff0c;C和Pyhont。C# 有大佬做了对应的Open…

使用 Neo4j 和 LangChain 集成非结构化知识图增强 QA

目前基于大模型的信息检索有两种方法&#xff0c;一种是基于微调的方法&#xff0c;一种是基于 RAG 的方法。 信息检索和知识提取是一个不断发展的领域&#xff0c;随着大型语言模型&#xff08;LLM&#xff09;和知识图的出现&#xff0c;这一领域发生了显着的变化&#xff0…

Docker五部曲之四:Docker Compose

文章目录 前言Compose应用程序模型Compose规范顶层属性servicenetworkvolumesconfigssecrets 环境变量.env文件environment属性主机shell中的环境变量 Profiles&#xff08;剖面&#xff09;启动剖面自动启动剖面和依赖项解析 多compose.yml文件共享与扩展构建规范构建属性 部署…

Java根据模板文件生成excel文件,同时将excel文件转换成图片

需求 需要将指定数据导出成表格样式的图片&#xff0c;如图 业务拆解 定义一个导出模板将得到的数据填入模板中&#xff0c;生成excel文件将ecxel文件转换成png格式的图片 代码实现 需要引入的依赖 <dependency><groupId>cn.hutool</groupId><artif…

[C++] opencv - Mat::convertTo函数介绍和使用场景

Mat::convertTo()函数 Converts an array to another data type with optional scaling. 该函数主要用于数据类型的相互转换。 The method converts source pixel values to the target data type. saturate_cast<> is applied at the end to avoid possible overf…

maven环境搭建(打包项目)

Maven:直观来讲就是打包写好的代码封装 Apahche 软件基金会&#xff08;非营业的组织&#xff0c;把一些开源软件维护管理起来&#xff09; maven apahce的一个开宇拿项目&#xff0c;是一个优秀的项目构建&#xff08;管理工具&#xff09; maven 管理项目的jar 以及jar与j…

uniapp 简易自定义日历

注&#xff1a;此日历是根据接口返回的日期自动对应星期的&#xff0c;返回的数据中也包含星期&#xff0c;其实就是一个div自定义&#xff0c;可根据自己需求更改&#xff1b; 1、组件代码 gy-calendar-self.vue <template><view class"calendar"><…

华为路由设备DHCPV6配置

组网需求 如果大量的企业用户IPv6地址都是手动配置&#xff0c;那么网络管理员工作量大&#xff0c;而且可管理性很差。管理员希望实现公司用户IPv6地址和网络配置参数的自动获取&#xff0c;便于统一管理&#xff0c;实现IPv6的层次布局。 图1 DHCPv6服务器组网图 配置思路 …

VLAN区域间路由详解

LAN局域网 WAN 广域网 WLAN无线局域网 VLAN:虚拟局域网 交换机和路由器&#xff0c;协同工作后&#xff0c;将原来的一个广播域&#xff0c;切分为多个&#xff0c;节省硬件成本&#xff1b; 配置思路&#xff1a; 交换机上创建vlan交换机上的各个接口划分到对应的vlan中 T…

meter报OOM错误,如何解决?

根据在之前的压测过程碰到的问题&#xff0c;今天稍微总结总结&#xff0c;以后方便自己查找。 一、单台Mac进行压测时候&#xff0c;压测客户端Jmeter启动超过2000个线程&#xff0c;Jmeter报OOM错误&#xff0c;如何解决&#xff1f; 解答&#xff1a;单台Mac配置内存为8G&…

【Android Studio】APP练手小项目——切换图片APP

本项目效果&#xff1a; 前言&#xff1a;本项目最终实现生成一个安卓APP软件&#xff0c;点击按钮可实现按钮切换图片。项目包含页面布局、功能实现的逻辑代码以及设置APP图标LOGO和自定义APP名称。 关于Android Studio的下载与安装见我的博文&#xff1a;Android Studio 最新…

IDEA新建SpringBoot工程时java版本只有17和21

解决方法&#xff1a;替换源 参考博客&#xff1a;https://www.kuazhi.com/post/712799571.html