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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 【Node.js+koa--后端管理系统】用户注册接口设计 | 连接Mysql数据库 | 校验注册权限

用户注册接口设计


① 编写流程


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

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

微信图片_20221012171143.png

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

image.png

//目录:@/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()

④ 数据库操作


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

微信图片_20221012171356.png

// 目录: @/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

image.png

② 连接数据库


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

微信图片_20221012171542.png

image.png

// 目录: @/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判断用户是否已经存在在数据库中。

① 创建数据库用户表① 创建数据库用户表微信图片_20221012171706.png

① 创建数据库用户表

# 创建用户表
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;

微信图片_20221012171902.png

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

// 目录: @/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]
  }

微信图片_20221012171957.png

④ 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)微信图片_20221012172120.png

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
4天前
|
Web App开发 JavaScript 前端开发
深入浅出Node.js: 打造高效后端服务
【10月更文挑战第39天】在数字化浪潮中,后端开发作为支撑现代Web应用的骨架,扮演着不可或缺的角色。Node.js,作为一种流行的服务器端JavaScript运行环境,因其非阻塞I/O和事件驱动的特性,被广泛应用于构建轻量且高效的后端服务。本文旨在通过浅显易懂的语言,结合生动的比喻和实际代码案例,带领读者深入理解Node.js的核心概念、架构设计及其在后端开发中的应用,进而掌握如何使用Node.js搭建稳定、可扩展的后端服务。无论你是初探后端开发的新手,还是寻求进阶的开发者,这篇文章都将为你提供有价值的指导和启示。
|
9天前
|
Web App开发 JavaScript 前端开发
深入浅出Node.js后端框架
【10月更文挑战第34天】在数字化时代,后端开发如同一座桥梁,连接着用户界面与数据处理的两端。本文将通过Node.js这一轻量级、高效的平台,带领读者领略后端框架的魅力。我们将从基础概念出发,逐步深入到实战应用,最后探讨如何通过代码示例来巩固学习成果,使读者能够在理论与实践之间架起自己的桥梁。
|
7天前
|
Web App开发 JavaScript 前端开发
深入浅出Node.js后端开发
【10月更文挑战第36天】本文将引导您探索Node.js的世界,通过实际案例揭示其背后的原理和实践方法。从基础的安装到高级的异步处理,我们将一起构建一个简单的后端服务,并讨论如何优化性能。无论您是新手还是有经验的开发者,这篇文章都将为您提供新的视角和深入的理解。
|
12天前
|
Web App开发 存储 JavaScript
深入浅出Node.js后端开发
【10月更文挑战第31天】本文将引导你进入Node.js的奇妙世界,探索其如何革新后端开发。通过浅显易懂的语言和实际代码示例,我们将一起学习Node.js的核心概念、搭建开发环境,以及实现一个简单但完整的Web应用。无论你是编程新手还是希望拓展技术的开发者,这篇文章都将为你打开一扇通往高效后端开发的大门。
|
13天前
|
Web App开发 JavaScript 前端开发
深入浅出Node.js后端开发
【10月更文挑战第30天】本文将通过一个Node.js的简单示例,引导你进入Node.js的世界。我们将从基础概念讲起,然后一步步深入到代码实现,最后总结Node.js在后端开发中的优势和应用场景。无论你是前端开发者还是后端新手,这篇文章都将为你打开一扇了解Node.js的大门。
26 2
|
10天前
|
Web App开发 JavaScript 前端开发
构建高效后端服务:Node.js与Express框架的实践
【10月更文挑战第33天】在数字化时代的浪潮中,后端服务的效率和可靠性成为企业竞争的关键。本文将深入探讨如何利用Node.js和Express框架构建高效且易于维护的后端服务。通过实践案例和代码示例,我们将揭示这一组合如何简化开发流程、优化性能,并提升用户体验。无论你是初学者还是有经验的开发者,这篇文章都将为你提供宝贵的见解和实用技巧。
|
12天前
|
Web App开发 JavaScript 中间件
构建高效后端服务:Node.js与Express框架的融合之道
【10月更文挑战第31天】在追求快速、灵活和高效的后端开发领域,Node.js与Express框架的结合如同咖啡遇见了奶油——完美融合。本文将带你探索这一组合如何让后端服务搭建变得既轻松又充满乐趣,同时确保你的应用能够以光速运行。
21 0
|
2月前
|
JavaScript
NodeJs的安装
文章介绍了Node.js的安装步骤和如何创建第一个Node.js应用。包括从官网下载安装包、安装过程、验证安装是否成功,以及使用Node.js监听端口构建简单服务器的示例代码。
NodeJs的安装
|
1月前
|
JavaScript 开发工具 git
已安装nodejs但是安装hexo报错
已安装nodejs但是安装hexo报错
26 2
|
2月前
|
存储 JavaScript 前端开发
Node 版本控制工具 NVM 的安装和使用(Windows)
本文介绍了NVM(Node Version Manager)的Windows版本——NVM for Windows的安装和使用方法,包括如何安装Node.js的特定版本、列出已安装版本、切换使用不同版本的Node.js,以及其他常用命令,以实现在Windows系统上对Node.js版本的便捷管理。
Node 版本控制工具 NVM 的安装和使用(Windows)

热门文章

最新文章