express,MySQL 实现登录接口,如果用户未注册直接注册

要实现一个登录接口,并在用户未注册时直接注册他们,您需要在您的 Express 应用中处理两个逻辑路径:一个是验证用户是否已存在(登录),另一个是在用户不存在时创建新用户(注册)。以下是一个简化的实现示例,它结合了登录和注册功能:

const express = require('express');
const mysql = require('mysql2/promise');
const bodyParser = require('body-parser');
const bcrypt = require('bcrypt'); // 用于密码哈希
const saltRounds = 10; // 密码哈希的盐轮数const app = express();
const port = 3000;// 配置 MySQL 连接池
const pool = mysql.createPool({host: 'localhost',user: 'root', // 根据实际情况修改password: 'your_password', // 根据实际情况修改database: 'login_db'
});// 使用 body-parser 中间件解析 JSON 请求体
app.use(bodyParser.json());// 登录/注册接口
app.post('/auth', async (req, res) => {const { username, password } = req.body;if (!username || !password) {return res.status(400).json({ message: 'Username and password are required' });}try {const connection = await pool.getConnection();// 检查用户是否存在const [rows] = await connection.execute('SELECT * FROM users WHERE username = ?', [username]);if (rows.length > 0) {// 用户已存在,验证密码const hashedPassword = rows[0].password;const isMatch = await bcrypt.compare(password, hashedPassword);if (isMatch) {return res.status(200).json({ message: 'Login successful', user: { username: rows[0].username } });} else {return res.status(401).json({ message: 'Invalid username or password' });}} else {// 用户不存在,注册新用户const hashedPassword = await bcrypt.hash(password, saltRounds);await connection.execute('INSERT INTO users (username, password) VALUES (?, ?)', [username, hashedPassword]);return res.status(201).json({ message: 'User registered and logged in successfully', user: { username } });}connection.release();} catch (err) {console.error(err);return res.status(500).json({ message: 'Internal server error' });}
});app.listen(port, () => {console.log(`Server is running on http://localhost:${port}`);
});

在这个示例中,我们做了以下事情:

  1. 使用 mysql2/promise 而不是 mysql2 来支持基于 Promise 的数据库操作,这使得异步代码更加简洁。
  2. 引入了 bcrypt 库来哈希密码,以确保密码在数据库中以安全的形式存储。
  3. 创建了一个 /auth 路由来处理登录和注册请求。
  4. 在接收到请求后,首先检查用户是否已存在。
  5. 如果用户存在,则验证提供的密码是否与存储的哈希密码匹配。
  6. 如果用户不存在,则使用提供的用户名和密码(经过哈希处理)创建一个新用户。
  7. 使用了 MySQL 连接池来管理数据库连接,以提高性能和资源利用率。

请注意,这个示例是为了教学目的而简化的,并且在实际生产环境中需要更多的安全措施,比如验证输入、防止 SQL 注入(尽管在这个例子中我们使用了参数化查询来避免这个问题)、处理并发请求等。此外,您可能还需要实现密码重置、账户锁定、日志记录等功能。

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

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

相关文章

ai智能论文生成系统有用吗?分享5款ai文献综述自动生成器

近年来,人工智能(AI)技术在学术写作领域的应用越来越广泛,尤其是在文献综述的自动生成方面。AI智能论文生成系统通过深度学习和自然语言处理技术,能够帮助研究人员快速生成高质量的文献综述,从而提高写作效…

物理学基础精解【56】

文章目录 物理学中的数论一次同余式及解法定义数学原理公式与计算例子例题 中国剩余定理(Chinese Remainder Theorem)定义数学原理公式计算步骤例子例题 中国剩余定理一、定义二、数学原理三、公式四、计算五、例子六、例题 参考文献 物理学中的数论 一…

YOLO v1详解解读

🚀 在此之前主要介绍了YOLO v5源码的安装和使用(YOLO v5安装教程),接下来将探索YOLO的实现原理,作为一个金典的单阶段目标检测算法,应该深度的理解它的构建思想;所以本系列文章将从LOVO v1出发到…

在 Ubuntu 18.04 上安装 Syncthing

在 Ubuntu 18.04 上安装 Syncthing 是一个简单的过程。Syncthing 提供官方的 apt 仓库,使用该仓库可以方便地安装和更新 Syncthing。 https://syncthing.net/downloads/ 文章目录 安装步骤 1: 添加 Syncthing 官方仓库步骤 2: 安装 Syncthing步骤 3: 启动并运行 S…

力扣 简单 110.平衡二叉树

文章目录 题目介绍解法 题目介绍 解法 平衡二叉树:任意节点的左子树和右子树的高度之差的绝对值不超过 1 //利用递归方法自顶向下判断以每个节点为根节点的左右子树的最大深度是否大于1 class Solution {public boolean isBalanced(TreeNode root) {if(root null){return tr…

SpringBoot在线教育系统:从零到一的构建过程

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及,互联网成为人们查找信息的重要场所,二十一世纪是信息的时代,所以信息的管理显得特别重要。因此,使用计算机来管理微服务在线教育系统的相关信息成为必然。开…

P1376 [USACO05MAR] Yogurt factory 机器工厂

真的不要怕做贪心的题目,原理都很简单。 题目描述 小 T 开办了一家机器工厂,在 N个星期内,原材料成本和劳动力价格不断起伏,第 i 周生产一台机器需要花费 Ci​ 元。若没把机器卖出去,每保养一台机器,每周…

html5 + css3(下)

目录 CSS基础基础认识体验cssCSS引入方式 基础选择器选择器-标签选择器-类选择器-id选择器-通配符 字体和文本样式1.1 字体大小1.2 字体粗细1.3 字体样式(是否倾斜)1.4 常见字体系列(了解)1.5 字体系列拓展-层叠性font复合属性文本…

上传本地项目到GitHub远程仓库(极简洁操作版)

第一步:在GitHub创建一个空的仓库 第二步:将仓库克隆(下载)到本地 第三步:将你要上传的所有文件放到这个克隆的仓库文件夹中 第四步:通过git add .将待上传文件添加到暂存区 此时,可以通过git …

网络基础 【HTTPS】

💓博主CSDN主页:麻辣韭菜💓   ⏩专栏分类:Linux初窥门径⏪   🚚代码仓库:Linux代码练习🚚 💻操作环境: CentOS 7.6 华为云远程服务器 🌹关注我🫵带你学习更多Linux知识…

科普篇--- 什么是硬件在环测试?

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不…

【60天备战2024年11月软考高级系统架构设计师——第38天:性能优化与高可用设计】

在设计现代云应用时,性能和高可用性是两个至关重要的目标。通过合理的设计和策略,可以确保系统在负载高峰期间仍能保持稳定和快速响应。 性能优化的关键策略 缓存机制:使用缓存技术(如Redis、Memcached)存储频繁访问…

第二十三章-容器控件QTabWidget

QTabWidget 是 PyQt5 中的一个容器小部件,它可以在一个窗口中创建多个选项卡,每个选项卡包含一个独立的页面。当用户单击不同的选项卡时,可以在相同的区域内显示不同的内容。QTabWidget 通常用于创建选项卡式界面,如浏览器、多设置选项的配置窗口等。 初步示例 下面是一个…

千万不要运行!几个可以整蛊你朋友的Python程序!

Python 能做很多无聊,但有意思的事情,例如接下来的一些案例。以下程序,不要发代码,要不实现不了你整蛊的目的。 要打包成一个 exe 程序,发给朋友才有意思,使用 pip install pyinstaller。 打包命令如下&a…

深度强化学习中收敛图的横坐标是steps还是episode?

在深度强化学习(Deep Reinforcement Learning, DRL)的收敛图中,横坐标选择 steps 或者 episodes 主要取决于算法的设计和实验的需求,两者的差异和使用场景如下: Steps(步数): 定义&a…

使用pytorch进行迁移学习的两个步骤

1. 步骤及代码 迁移学习一般都会使用两个步骤进行训练: 固定预训练模型的特征提取部分,只对最后一层进行训练,使其快速收敛;使用较小的学习率,对全部模型进行训练,并对每层的权重进行细微的调节。 impor…

利用 notepad++ 初步净化 HaE Linkfinder 规则所提取的内容(仅留下接口行)

去掉接口的带参部分 \?.*去掉文件行 .*\.(docx|doc|xlsx|xls|txt|xml|html|pdf|ppt|pptx|odt|ods|odp|rtf|md|epub|css|scss|less|sass|styl|png|jpg|jpeg|gif|svg|ico|bmp|tiff|webp|heic|dds|raw|vue|js|ts|mp4|avi|mov|wmv|mkv|flv|webm|mp3|wav|aac|flac|ogg|m4a).*(\r\…

Redission · 可重入锁(Reentrant Lock)

前言 Redisson是一个强大的分布式Java对象和服务库,专为简化在分布式环境中的Java开发而设计。通过Redisson,开发人员可以轻松地在分布式系统中共享数据、实现分布式锁、创建分布式对象,并处理各种分布式场景的挑战。 Redisson的设计灵感来…

【AI大模型】使用Embedding API

一、使用OpenAI API 目前GPT embedding mode有三种,性能如下所示: 模型每美元页数MTEB得分MIRACL得分text-embedding-3-large9,61554.964.6text-embedding-3-small62,50062.344.0text-embedding-ada-00212,50061.031.4 MTEB得分为embedding model分类…

如何解决深拷贝循环引用的问题

深拷贝循环引用的问题是JavaScript中一个常见且需要仔细处理的问题。循环引用指的是对象之间存在相互引用的关系,形成一个闭环,这样在深拷贝过程中可能会导致递归无限循环,占用大量内存,并最终导致堆栈溢出。以下是一些解决深拷贝…