【Node】中Express框架连接Mysql实现用户注册接口

news2024/12/26 23:23:14

Node.js中Express框架连接Mysql实现用户注册接口

处理用户注册接口简单分为三步:

1、注册校验

2、完善逻辑

3、拆分模块

拆分模块能够使部分功能能够复用,封装好各个模块使得模块间只能通过有限的接口互相访问,从而降低耦合,拆分模块使得前期提升开发效率,后期维护更加方便

目前目录如下

app中config.js用来写配置文件,database是配置数据库

controller是集成业务逻辑

middleware 是集成中间件

router为路由

services为集中sql函数

目录在这里插入图片描述

安装的包为express,mysql2,nodemon

app.js

const express = require("express")
const app = express()
// 引入配置文件
const {APP_PORT} = require("./app/config")
//连接数据库
require("./app/database")

//解析post请求参数
app.use(express.json()) //解析json格式
app.use(express.urlencoded()) //解析form表单格式

const router = require("./router")
app.use(router)

app.listen(APP_PORT, () => {
    console.log(`服务器启动成功 http://localhost:${APP_PORT}`);
})

router中的app.js

const express = require("express")
const router = express.Router()
// 中间件
const {verfyRegister} = require("../middleware/app-middleware")
// 控制器
const {handleRegister} = require("../controller/app-controller")

//用户注册
router.post("/register",verfyRegister,handleRegister)

router.post("/login",(req,res)=> {
    res.json({
        code: 200,
        msg: "注册成功"
    })
})

module.exports = router

router中的index.js

const express = require("express")
const router = express.Router()

router.use("/sys",require('./app'))// /sys是前缀 可以通过use加
router.use(require('./user'))

module.exports = router
//index.js文件是将其他接口总结起来,方便调用

router中的user,js

const express = require("express")
const router = express.Router()

router.get("/user",(req,res)=> {
    res.json({
        code: 200,
        msg: "成功",
        data:{
            username:"zhangsan",
            email:"110@163.com"
        }
    })
})


module.exports = router

controller

const { insertUserByUsername } = require("../services/app-services")


class appController {
    // 处理注册的业务逻辑
    async handleRegister (req, res) {
        // 1、获取前端传过来的数据
        // 2、校验注册信息是否存在,不存在return
        // 3、从数据库校验用户是否注册过
        // 4、保存进数据库
        const { username, password, tel } = req.body
        try {
            await insertUserByUsername(username, password,tel)
            res.json({
                code: 200,
                msg: "注册成功"
            })
        } catch (error) {
            res.status(500).send("服务器出问题了")

        }
    }
}


//appController是一个类,所以需要new一个实例对象出来
module.exports = new appController()

middleware

const { getUserByUsername } = require("../services/app-services")

//校验注册的中间件
const verfyRegister = async (req, res, next) => {
    const { username, password, tel } = req.body
    if (!username || !password || !tel) {
        res.status(401).json({
            code: '-1',
            msg: "用户名和密码和手机号必填"
        })
        return
    }
    try {
        //查询数据库,查询用户在数据库中是否存在
        const dbRes = await getUserByUsername(username, password)
        if (dbRes.length !== 0) {
            res.send({
                code: '-1',
                msg: "该用户已注册,请登录"
            })
            return
        }
    } catch (error) {
        res.status(500).send("服务器出问题了")
        return
    }
    next()
}



module.exports = {
    verfyRegister
}

app中的config.js

const config = {
    //端口号
    APP_PORT: 3309,
    //mysql配置
    MYSQL_host: "localhost",
    MYSQL_user: "root",
    MYSQL_password: "你的密码",
    MYSQL_port: 你的端口号,
    MYSQL_database: "你的数据库名称",
    MYSQL_waitForConnections: true,
    MYSQL_connectionLimit: 10,
    MYSQL_queueLimit: 0,

}

module.exports = config

app中的database.js

const mysql = require("mysql2")
const { MYSQL_host, MYSQL_user,MYSQL_password,MYSQL_port, MYSQL_database, MYSQL_waitForConnections, MYSQL_connectionLimit, MYSQL_queueLimit } = require("./config")

const connections = mysql.createPool({
    host: MYSQL_host,
    user: MYSQL_user,
    password: MYSQL_password,
    port:MYSQL_port,
    database: MYSQL_database,
    waitForConnections: MYSQL_waitForConnections, 
    connectionLimit: MYSQL_connectionLimit,
    queueLimit: MYSQL_queueLimit,

})

connections.getConnection(function (err, conn) {
    conn.connect((err) => {
        if (err) {
            console.log("连接失败", err);
        } else {
            console.log("数据库连接成功~");
        }
    });
})


module.exports = connections.promise()

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

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

相关文章

LeetCode[1046]最后一块石头的重量

难度&#xff1a;简单 题目&#xff1a; 有一堆石头&#xff0c;每块石头的重量都是正整数。每一回合&#xff0c;从中选出两块最重的 石头&#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和 y&#xff0c;且 x < y。那么粉碎的可能结果如下&#xff1a;如果 x …

『年度总结』时光如梭 | 再见 2022 | 你好 2023

⭐创作时间2022年12月31日⭐ ✨结果一直到现在才发&#xff0c;说真的写年度总结还是第一次写比较不熟练&#xff0c;去年有这个活动也有佬叫我参加&#xff0c;不过没参加。今年想着有时间来写下的&#xff0c;结果写到现在才发&#xff0c;这东西说真的挺难写的&#…

机器视觉(九):图像配准

目录&#xff1a; 机器视觉&#xff08;一&#xff09;&#xff1a;概述 机器视觉&#xff08;二&#xff09;&#xff1a;机器视觉硬件技术 机器视觉&#xff08;三&#xff09;&#xff1a;摄像机标定技术 机器视觉&#xff08;四&#xff09;&#xff1a;空域图像增强 …

python简单爬虫

爬虫真是一件有意思的事儿啊&#xff0c;之前写过爬虫&#xff0c;用的是urllib2、BeautifulSoup实现简单爬虫&#xff0c;scrapy也有实现过。最近想更好的学习爬虫&#xff0c;那么就尽可能的做记录吧。这篇博客就我今天的一个学习过程写写吧。 一 正则表达式 正则表达式是一…

格式化电脑重装系统怎么操作

​电脑一但中毒的电脑必须重装系统&#xff0c;而且需要格式化后重装系统&#xff0c;才能将病毒铲除&#xff0c;那么如何将电脑格式化后重装系统呢&#xff1f;能够实现电脑格式化重装系统的方法是U盘重装和光盘重装&#xff0c;由于部分电脑没有光驱&#xff0c;建议用U盘&a…

Redis常见集群方案

Redis常见集群方案 Redis集群方案目前主流的有三种&#xff0c;分别是Twemproxy、Codis和Redis Cluster。 Redis Cluster Redis Cluster 集群是去中心化通过客户端分片的结构&#xff0c;集群元数据信息分布在每个节点上&#xff0c;主备切换依赖于多个节点协商选主。 Red…

C++11之lambda表达式

文章目录一、引入原因二、lambda 表达式的语法1. lambda 表达式各部分说明2.捕捉列表说明三、lambda 表达式的本质一、引入原因 如果待排序元素为自定义类型&#xff0c;需要用户定义排序时的比较规则。 比如&#xff1a; struct Goods {string _name; // 名字double _pr…

idea调试npm、tomcat远程服务(包括docker部署方式)

前言 idea调试npm、tomcat远程服务&#xff1a;包括docker部署方式及非docker部署方式 博客地址&#xff1a;芒果橙的个人博客 【http://mangocheng.com】 调试npm项目 1. 新增一个npm项目 2. 配置package.json及启动脚本 3. debug模式启动 远程调试docker部署的项目 1. 配置…

XMLTomcatHttp协议

XML&Tomcat&Http协议 学习目标 了解配置文件的作用了解常见的配置文件类型掌握properties文件的编写规范掌握xml文件的编写了解xml文件的约束掌握xml文件的解析掌握Tomcat的安装掌握Tomcat的使用掌握Tomcat在IDEA中的使用了解HTTP协议的发展历程了解HTTP1.0和HTTP1.1…

ConcurrentHashMap源码阅读笔记:initTable()方法

一、非常重要的sizeCtl属性 initTable()方法的作用是初始化哈希表&#xff0c;初始化哈希表就要有确定哈希表容量、创建哈希表并将哈希表的引用赋值、修改哈希表的阈值等步骤。initTable()方法里面采用了不加锁方式来确保在高并发的环境下创建哈希表的全部步骤都只能由一个线程…

Android入门第57天-使用OKHttp多线程制作像迅雷一样的断点续传功能

简介今天我们将继续使用OkHttp组件并制作一个基于多线程的可断点续传的下载器来结束Android OkHttp组件的所有知识内容。在这一课里我们会在上一次课程的基础上增加SQLite的使用以便于我们的App可以暂存下载时的实时进度&#xff0c;每次下载开始都会判断是覆盖式还是续传式下载…

(3)go-micro微服务项目搭建

文章目录一 微服务项目介绍二 go-micro安装1.拉取micro镜像2.生成项目目录三 项目搭建使用DDD模式开发项目&#xff1a;四 最后一 微服务项目介绍 账户功能是每一个系统都绕不开的一部分&#xff0c;所以本次搭建的微服务项目就是账户微服务项目&#xff0c;其中向外暴露的功能…

【C语言航路】第十站:指针进阶(一)

目录 一、字符指针 二、指针数组 三、数组指针 1.数组指针的定义 2.数组名和&数组名 3.数组指针的使用 四、数组参数、指针参数 1.一维数组传参 2.二维数组传参 3.一级指针传参 4.二级指针传参 五、函数指针 总结 一、字符指针 我们知道指针有一种类型叫做字符…

Vue3新特性

文章目录一 新特性之组合API1.1 ref&reactive1.2 methods1.3 props和context1.4 完整代码&效果演示二 Vue3新特性之生命周期函数(在setup中)三 父子级组件间数据传递3.1 Provide&Inject四 Fragment&#xff08;碎片&#xff09;一 新特性之组合API 1.1 ref&re…

XMLHttpRequest和Referer

XMLHttpRequest 对象简介 1999年&#xff0c;微软公司发布 IE 浏览器5.0版&#xff0c;第一次引入新功能&#xff1a;允许 JavaScript 脚本向服务器发起 HTTP 请求。这个功能当时并没有引起注意&#xff0c;直到2004年 Gmail 发布和2005年 Google Map 发布&#xff0c;才引起广…

承蒙时光不弃,做个好人!

落幕 2022年博客之星终于要在今晚2023年1月7日24点整落下帷幕&#xff0c;从上个月28号开始&#xff0c;仿佛经历了一场噩梦&#xff0c;本是抱着随便玩玩的心态报了名&#xff0c;没成想&#xff0c;刚开始自投五星之后竟然显示10几名&#xff0c;那是不是我稍加努力就进前十…

狂揽两千星,速度百倍提升,高性能 Python 编译器 Codon 火了

前言 众所周知&#xff0c;Python 是一门简单易学、具有强大功能的编程语言&#xff0c;在各种用户使用统计榜单中总是名列前茅。相应地&#xff0c;围绕 Python&#xff0c;研究者开发了各种便捷工具&#xff0c;以更好的服务于这门语言。 编译器充当着高级语言与机器之间的…

TensorFlow笔记之单神经元完成多分类任务

文章目录前言一、逻辑回归1.二分类问题2.多分类问题二、数据集调用三、TensorFlow1.x1.定义模型2.训练模型3.结果可视化四、TensorFlow2.x1.定义模型2.训练模型3.结果可视化总结前言 记录分别在TensorFlow1.x与TensorFlow2.x中使用单神经元完成MNIST手写数字识别的过程。 一、…

Linux出现ping: www.baidu.com: 未知的名称或服务解决方法

文章目录解决对象方法先找到网关在Windows下进行VMnet8的配置ping成功Linux出现ping: www.baidu.com: 未知的名称或服务解决方法 解决对象 本文的方法用于各位大佬已经用过以下方法仍然无法ping成功 Linux防火墙已关闭和Windows防火墙已经关闭已经配置好 vim /etc/sysconfig/…

手撕C语言理论知识(上)粗略讲解C语言的部分入门知识

目录 C语言的一些基础知识 操作符简介 Scanf的%[ ] 语句&#xff08;分支、循环、goto&#xff09; 函数 C语言的一些基础知识 主函数 - 程序的入口 - main函数有且仅有一个。char - short - int - long - long long - float - double%d - 十进制整型 %u - 无符号整型 %…