草庐IT

【Node.js+koa--后端管理系统】用户注册接口设计 | 连接Mysql数据库 | 校验注册权限

贤蛋大眼萌 2024-04-16 原文

多一些不为什么的坚持 \color{#0000FF}{多一些不为什么的坚持} 多一些不为什么的坚持 🙊

贤蛋🥚大眼萌,一名很普通但不想普通的程序媛 \color{#FF0000}{贤蛋 🥚大眼萌 ,一名很普通但不想普通的程序媛} 贤蛋🥚大眼萌,一名很普通但不想普通的程序媛🤳

📝本文章收录于专栏:Node.js+koa–后端管理系统

🍳该项目收录于github:ITClub

用户注册接口设计 | 连接Mysql数据库 | 校验注册权限

🚀 用户注册接口设计

① 编写流程

  • 注册用户路由router编写;
  • 处理函数的控制器controller编写;
  • 操作数据库的service编写;

采用分层架构的思维,不同的模块处理不同的内容。

注意:需要安装koa对body解析的依赖

//目录:@/oruter/index.js
// 封装路由
const fs = require ('fs')

const useRoutes = function (){
 fs.readdirSync(__dirname).forEach(file=>{
   if(file === 'index.js') return;
   const router = require(`./${file}`)
   this.use(router.routes());
   this.use(router.allowedMethods())
 })
}
module.exports = useRoutes
//目录:@/app/index.js
const Koa = require("koa")
const bodyParser = require("koa-bodyparser")

const useRoutes = require('../router') // 创建路由
const errorHandler = require('./error_handle') // 错误处理文件

const app = new Koa()

app.useRoutes = useRoutes;

app.use(bodyParser())
app.useRoutes()
app.on('error',errorHandler) //触发错误处理函数

module.exports = app

② 注册用户路由

// 目录: @/router/user_router.js
const Router = require("koa-router")

const { create } = require("../controller/user_controller")

const userRouter = new Router({ prefix: "/users" })

userRouter.post("/", create)

module.exports = userRouter

③ 控制层处理函数

// 目录: @/controller/user_controller.js
const userService = require("../service/user_service")

class UserController {
  // 创建用户
  async create(ctx, next) {
    const user = ctx.request.body
    const results = await userService.create(user)
    ctx.body = results
  }
}

module.exports = new UserController()

④ 数据库操作

先编写数据库操作语句,后面单独将数据库连接处理

// 目录: @/service/user_service.js
const connection = require("../app/database")

class UserService {
  async create(user) {
    // 将user储存到用户表中
    const statement = `INSERT INTO user (name,password) VALUES(?,?);`
    // console.log("用户存入数据库成功");
    return results[0]
  }
}
module.exports = new UserService()

🏓 连接Mysql数据库

① 安装 mysql2

npm install mysql2

② 连接数据库

这里的环境变量需要自己在.env环境配置文件中填写,这样只需要在.env文件中修改数据库配置信息就可以了。

// 目录: @/app/database.js
// 完整的数据库连接配置
const mysql = require('mysql2')

const config = require('./config')

const connections = mysql.createPool({
  host: config.MYSQL_HOST,
  port: config.MYSQL_PORT,
  database: config.MYSQL_DATABASE,
  user: config.MYSQL_USER,
  password: config.MYSQL_PASSWORD
});

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

module.exports = connections.promise();

🥁 注册用户校验

编写用户注册的中间件,用户写入用户名和密码,编写中间件verifyUser判断用户是否已经存在在数据库中。

① 创建数据库用户表

# 创建用户表
CREATE TABLE IF NOT EXISTS `user`(
	id INT PRIMARY KEY AUTO_INCREMENT,
	name VARCHAR(30) NOT NULL UNIQUE,
	password VARCHAR(50) NOT NULL,
	createAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
	updateAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

② 创建错误信息处理文件

独立编写一个错误常量文件(完整)(@/app/error_handle.js)

// 目录: @/constants/error_types.js
const NAME_OR_PASSWORD_IS_REQUIRED = 'name_or_password_is_required';
const USER_ALREADY_EXISTS = 'user_already_exists';
const USER_DOES_NOT_EXISTS = 'user_does_not_exists';
const PASSWORD_IS_INCORRENT = 'password_is_incorrent';
const UNAUTHORIZATION = 'UNAUTHORIZATION';
const UNPERMISSION = 'unpermission';

module.exports = {
  NAME_OR_PASSWORD_IS_REQUIRED,
  USER_ALREADY_EXISTS,
  USER_DOES_NOT_EXISTS,
  PASSWORD_IS_INCORRENT,
  UNAUTHORIZATION,
  UNPERMISSION
}
const errorTypes = require('../constants/error_types')

const errorHandler = (error,ctx) =>{
//  // 这里的 error.message = new Error(里面的值)
  let status,message;
  switch(error.message){
    case errorTypes.NAME_OR_PASSWORD_IS_REQUIRED:
      // console.log(error.message);
      status = 400; //Bad Request
      message = "用户名和密码不能为空"
      break;
    case errorTypes.USER_ALREADY_EXISTS:
      status = 405; //conflict
      message = "用户名已存在"
      break;
    case errorTypes.USER_DOES_NOT_EXISTS:
      status = 400; //conflict
      message = "用户名不存在"
      break;  
    case errorTypes.PASSWORD_IS_INCORRENT:
      status = 400; //conflict
      message = "密码错误"
      break;  
    case errorTypes.UNAUTHORIZATION:
      status = 401; //unauthorization
      message = "token无效"
      break;  
    case errorTypes.UNPERMISSION:
      status = 401; //unauthorization
      message = "您不具备权限"
      break; 
    default:
      status = 404;
      message = "默认错误";
}
  ctx.status = status;
  ctx.body = message;
}

module.exports = errorHandler;

③ 编写验证用户是否存在中间件

// 目录: @/middleware/user_middleware.js
const errorTypes = require("../constants/error_types")
const serviece = require("../service/user_service")

const verifyUser = async (ctx, next) => {
  console.log("用户注册验证middleware")
  // 1.获取用户名和密码
  const { name, password } = ctx.request.body
  // console.log(name,password);

  // 2.判断用户名或者密码不能为空
  if (!name || !password || name === "" || password === "") {
    const error = new Error(errorTypes.NAME_OR_PASSWORD_IS_REQUIRED)
    //   // 发射错误信息
    //   console.log(error);
    return ctx.app.emit("error", error, ctx)
  }
  // 3.判断这次注册的用户名是注册过的
  const results = await serviece.getUserByName(name)
  if (results.length) {
    const error = new Error(errorTypes.USER_ALREADY_EXISTS)
    return ctx.app.emit("error", error, ctx)
  }
  await next()
}
module.exports = {
  verifyUser
}
 // 目录: @/service/user_service.js
// 查询用户是否存在数据库中
  async getUserByName(name) {
    const statement = `SELECT *FROM user WHERE name = ?;`
    const results = await connection.execute(statement, [name])
    return results[0]
  }

④ MD5加密密码

将用户注册的密码拦截之后加密,再存储到数据库中,防止数据库泄露,这里采用MD5加密

npm install blueimp-md5

创建 handlePassword 函数,在user_middleware.js中中间件verifyUser中插入

const handlePassword = async (ctx, next) => {
  const { password } = ctx.request.body
  ctx.request.body.password = md5password(password)
  await next()
}

创建工具函数,处理MD5密码加密(@/utils/password_handle.js)

有关【Node.js+koa--后端管理系统】用户注册接口设计 | 连接Mysql数据库 | 校验注册权限的更多相关文章

  1. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  2. ruby - 续集在添加关联时访问many_to_many连接表 - 2

    我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以

  3. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  4. ruby - 无法在 60 秒内获得稳定的 Firefox 连接 (127.0.0.1 :7055) - 2

    我使用的是Firefox版本36.0.1和Selenium-Webdrivergem版本2.45.0。我能够创建Firefox实例,但无法使用脚本继续进行进一步的操作无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055)错误。有人能帮帮我吗? 最佳答案 我遇到了同样的问题。降级到firefoxv33后一切正常。您可以找到旧版本here 关于ruby-无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055),我们在StackOverflow上找到一个类

  5. 电脑0x0000001A蓝屏错误怎么U盘重装系统教学 - 2

      电脑0x0000001A蓝屏错误怎么U盘重装系统教学分享。有用户电脑开机之后遇到了系统蓝屏的情况。系统蓝屏问题很多时候都是系统bug,只有通过重装系统来进行解决。那么蓝屏问题如何通过U盘重装新系统来解决呢?来看看以下的详细操作方法教学吧。  准备工作:  1、U盘一个(尽量使用8G以上的U盘)。  2、一台正常联网可使用的电脑。  3、ghost或ISO系统镜像文件(Win10系统下载_Win10专业版_windows10正式版下载-系统之家)。  4、在本页面下载U盘启动盘制作工具:系统之家U盘启动工具。  U盘启动盘制作步骤:  注意:制作期间,U盘会被格式化,因此U盘中的重要文件请注

  6. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  7. 使用canal同步MySQL数据到ES - 2

    文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

  8. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  9. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  10. kvm虚拟机安装centos7基于ubuntu20.04系统 - 2

    需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc

随机推荐