koa搭建服务器(二)

news2024/11/25 22:28:42

在上一篇文章已经成功的运行了一个http服务器,接下来就是使用Sequelize ORM(官方文档:Sequelize 简介 | Sequelize中文文档 | Sequelize中文网)来操作数据库。

1、安装依赖

首先也是需要安装相关的依赖

npm i sequelize
npm i mysql2

2、连接数据库

2.1 创建Sequelize实例&定义模型属性

由于在实际项目中连接一个数据库中的多个表,所以在这里我建了一个models文件夹,index.js用来遍历models文件夹下的js文件并依次创建实例

// index.js

const { Sequelize } = require('sequelize');
const fs = require('fs');
const path = require('path');
const config = require('../config');// 数据库配置的文件,单独整合出来

const basename = path.basename(__filename);
const models = {};
let sequelize;

const initModels = async () => {
  if (!config.mysql.host || !config.mysql.port) {
    return null;
  }

  // 创建实例
  sequelize = new Sequelize({
    dialect: 'mysql',
    logging: config.isDev
      ? (msg) => {
          logger.debug('msg---',msg);
        }
      : false,
    timezone: '+08:00', // 修正时区
    ...config.mysql,
  });

  // 遍历models文件夹下的所有文件并返回后缀名为js的文件,modelFiles: [MultiAccount.js, Sort.js]
  const modelFiles = fs.readdirSync(__dirname).filter((file) => {
    return file.indexOf('.') !== 0 && file !== basename && file.slice(-3) === '.js';
  });

  // 如果modelFiles不存在或者modelFiles的长度为0,直接退出
  if (!modelFiles || !(modelFiles.length)) {
    return null;
  }

  // 遍历modelFiles中的每一项,并进行实例的创建
  modelFiles.forEach((file) => {
    const modelDefinition = require(path.join(__dirname, file));
    // `sequelize.define` 会返回模型
    const model = sequelize.define(
      modelDefinition.modelName,
      {
        ...modelDefinition.attributes,
      },
      modelDefinition.options,
    );
    // 把创建好的实例存到对象models中,键名为对应js文件中定义的modelName,键值为model实例
    models[modelDefinition.modelName] = model;
  });


  try {
    await sequelize.authenticate();
    logger.info(`MYSQL连接成功 ${config.mysql.host}:${config.mysql.port}`);
  } catch (error) {
    logger.error(`MYSQL连接失败[${config.mysql.host}:${config.mysql.port}] :${error}`);
    return null;
  }

  return sequelize;
};

module.exports = {
  initModels,
  models,
  sequelize,
};

if (require.main === module) {
  sequelize
    .authenticate()
    .then(() => {
      console.log('Connection has been established successfully.');
    })
    .catch((error) => {
      console.error('Unable to connect to the database:', error);
    });
}

定义属性则跟上文一样,在对应的js文件中,例如:

// MultiAccount.js

const { DataTypes } = require('sequelize');

module.exports = {
  modelName: 'MultiAccount',
  attributes: {
    fb_time: {
      type: DataTypes.CHAR,
      defaultValue: '',
    },
    fb_id: {
      type: DataTypes.INTEGER,
      defaultValue: '',
    },
    fb_userid: {
      type: DataTypes.INTEGER,
      defaultValue: '',
    },
    target_userid: {
      type: DataTypes.INTEGER,
      defaultValue: '',
    },
    target_login_time: {
      type: DataTypes.CHAR,
      defaultValue: '',
    },
    rela_users: {
      type: DataTypes.CHAR,
      defaultValue: '',
    },
    target_type: {
      type: DataTypes.INTEGER,
      defaultValue: '',
    },
    qa_content: {
      type: DataTypes.CHAR,
      defaultValue: '',
    },
    qa_pics: {
      type: DataTypes.CHAR,
      defaultValue: '',
    },
    status: {
      type: DataTypes.INTEGER,
      defaultValue: '0',
    },
    sorts: {
      type: DataTypes.CHAR,
      defaultValue: '',
    },
    create_time: {
        type: DataTypes.CHAR,
        defaultValue: '',
      },
  },
  options: {
    tableName: 'multi_account',
    createdAt: false,// 不自动增加createdAt数据创建时间字段,默认为true
    updatedAt: false,// 不自动增加updatedAt数据更新时间字段,默认为true
  },
};

2.2操作数据库

操作数据库就可以使用Sequelize内置的方法了,这里用我的查询接口为例,接口可以支持日期、状态、分类、分页查询,所以需要动态给where添加相应的条件

let where ={}// 查询条件
  
static async getFbList(ctx) {
    const { start_time, end_time, status = '-1', sort = '-1', page, pageSize } = ctx.request.body
    //日期查询(默认当天数据,前端传过来)
    if (start_time && end_time) {
      where = {
        ...where,
        fb_time: {
          [Op.between]: [start_time, end_time]
        }
      }
    }
    //状态查询(默认为-1全部数据)
    if (status !== '-1') {
      where = {
        ...where,
        status: {
          [Op.eq]: [status]
        }
      }
    }
    //分类查询
    if (sort !== '-1') {
      where = {
        ...where,
        sorts: {
          [Op.eq]: [sort]
        }
      }
    }
    //当前查询条件下的数据总数
    const total = await models.MultiAccount.count({where: where})
    //当前查询条件下的数据列表,offset为去掉前多少个数据,limit为每页数据的数量,order是根据fb_time这个字段来排序
    const fb_list = await models.MultiAccount.findAll({where: where, limit: Number(pageSize), offset: Number((page - 1)*pageSize), order:[['fb_time']] });
    
    //查询成功后重置查询条件
    where = {}

    ctx.body = {
      list: fb_list,
      total,
    };
  }

框架其他的一些方法可以看下以下文章,

1、使用Sequelize - 廖雪峰的官方网站 (liaoxuefeng.com)
2、使用Sequelize模块操作数据库之增删改查_sequelize修改语句-CSDN博客
3、模型查询(基础) | Sequelize中文文档 | Sequelize中文网

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

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

相关文章

【Mysql】数据库三大范式

数据库三范式 :数据库三范式是指关系型数据库设计中的三种规范化设计原则,旨在减少数据冗余、提高数据一致性和可维护性。 第一范式:规定表中的每一列都应该是不可分割的最小单元。 为什么要这样实现呢? :举个栗子…

【Unity PlasticSCM】记录:从介绍 下载 到拉取项目

实习的时候项目是svn管理的,这次mini的项目管理最后选择了美术策划友好的plasticSCM,但之前没有接触过,所以决定花费一点时间去了解,然后记录一下中间遇到的一些问题。 了解及下载Plastic b站很详细介绍PlasticSCM:Un…

ChatGPT扩展系列之ChatExcel

文章目录 ChatGPT扩展系列之ChatExcel对某一列的文字进行处理对数据进行排序对数据进行计算微软官方又推出Excel AI插件ChatGPT扩展系列之ChatExcel 自从ChatGPT很空出世之后,很多基于ChatGPT的应用便如雨后春笋般应用而生,这些应用的底层本质就是利用了ChatGPT对自然语言的…

计网强化

文章目录 1.TCP报文段、IP分组、MAC帧(1)TCP报文段 首部字段①发送窗口、接收窗口、拥塞窗口、滑动窗口(2)IP数据报 首部格式①片偏移量(3)MAC帧2.转发表、路由表、ARP表3.网络三层设备(1)集线器、交换机、路由器(2)冲突域与广播域(3)广播(4)时延

高等数学教材重难点题型总结(七)微分方程

高数上册最后一章,虽然不如积分难,但也颇为恶心,好在套路很固定,重点在于:区分方程类型,记忆求解公式~ 此外,诸如伯努利、欧拉方程等内容,是考研数学一的内容,学校的期末…

AI:40-基于深度学习的森林火灾识别

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌本专栏包含以下学习方向: 机器学习、深度学…

3 ALS算法的优化

3.1引入时间遗忘曲线 3.2引入物品特征 3.3时间特征和物品特征加权融合 ALS优化算法的执行步骤 将式(12)对原始评分矩阵进行优化,再代入 式(3)得到了优化后的ALS算法。该算法步骤如下: 第一步:读取数据集,初始化用户-物品评分

Illustrator 2024(AI v28.0)

Illustrator 2024是一款功能强大的矢量图形编辑软件,由Adobe公司开发。它是设计师、艺术家和创意专业人士的首选工具,用于创建和编辑各种矢量图形、插图、图标、标志和艺术作品。 以下是Adobe Illustrator的主要功能和特点: 矢量图形编辑&…

Kotlin协程核心理解

一、协程是什么? 1.1 基本概念的理解 我们知道JVM中的线程的实现是依赖其运行的操作系统决定的,JVM只是在上层进行了API的封装,包含常见的有线程的启动方法,状态的管理,比如:Java中抽象出了6种状态&#x…

软件测试自学路线

一、简介 本文从一个简单的登录接口测试入手,一步步调整优化接口调用姿势,然后简单讨论了一下接口测试框架的要点,最后介绍了一下我们目前正在使用的接口测试框架pithy。期望读者可以通过本文对接口自动化测试有一个大致的了解。 二、引言 …

0038Java程序设计-基于java高校社团管理系统论

文章目录 **摘 要****目** **录**系统实现开发环境 摘 要 当前,大多数高校的社团信息管理都是采用纸质档案的方式来管理的,这样不仅不能长期的保存信息,而且在数据的查找上带来很大的不方便。在目前的网络技术和计算机技术的普及和信息管理的…

AVL树、红黑树的介绍和实现[C++]

本文主要对AVL树和红黑树的结构和实现方法进行一定的介绍,仅实现部分接口。 目录 一、AVL树 1.AVL树的概念 2.AVL树节点的定义 3.AVL树的插入 4.AVL树的旋转 1. 新节点插入较高左子树的左侧——左左:右单旋 2. 新节点插入较高右子树的右侧——右…

MySQL(1):开始

概述 DB:数据库(Database) 即存储数据的“仓库”,其本质是一个文件系统。它保存了一系列有组织的数据。 DBMS:数据库管理系统(Database Management System) 是一种操纵和管理数据库的大型软件…

对Linux线程的理解(什么是线程,线程的创建终止等待分离,线程互斥,Linux常见的锁,线程同步),两万字总结,有这一篇文章就够了!

文章目录 一、什么是线程1.线程是怎样描述的2.线程与进程的区别3.线程的优缺点4.理解Linux的轻量级进程 二、Linux线程控制1.线程创建:pthread_create()2.线程终止:pthread_exit()3.线程等待:pthread_join()4.分离线程:pthread_detach() 三、Linux线程互斥1.互斥量2.线程安全与…

UNUNX安全的交易所

去中心化 传统意义上的交易所都属于中心化的交易所,用户需要在交易所注册人个信息,办理银行卡,充值到交易所帐号才能交易此时你的资产是在交易所被交易所托管,如果交易所做恶用户将会蒙受损失,交易所关闭跑路的案例也…

私有云:【5】安装VCenter Server

私有云:【5】安装VCenter Server 1、在本地物理机上安装VCenter Server到Esxi1.1、开始安装第一阶段1.2、开始安装第二阶段 2、配置VCenter2.1、分配许可2.2、添加主机2.3、创建数据存储NFS 1、在本地物理机上安装VCenter Server到Esxi 安装前在AD域服务器配置好VC…

jmeter BeanShell预处理程序:报错JSONObject not found in namespace

1、jmeter运行报错: ERROR o.a.j.u.BeanShellInterpreter: Error invoking bsh method: eval Sourced file: inline evaluation of: ". . . : Typed variable declaration : Class: JSONObject not found in namespace WARN o.a.j.m.BeanShellPreProcessor: Problem…

分类预测 | Matlab实现KOA-CNN-GRU-selfAttention多特征分类预测(自注意力机制)

分类预测 | Matlab实现KOA-CNN-GRU-selfAttention多特征分类预测(自注意力机制) 目录 分类预测 | Matlab实现KOA-CNN-GRU-selfAttention多特征分类预测(自注意力机制)分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matla…

企业年度经营计划预算最全攻略来了!附年度费用预算表格模板

经营分析里最重要,也最让人头大的部分,莫过于制定经营计划。现实中很多企业因为制定年度经营预算费用不善,导致年度经营计划与预算脱节,年度计划成了摆设…… 年度费用预算表 为了摆脱企业年度经营与发展,并作出科学合…

[云原生案例1.] 构建LNMP架构并运行Wordpress个人博客平台

文章目录 1. 当前需求2. 前置准备3. 搭建过程3.1 创建自定义网络3.2 部署并配置nginx3.2.1 创建工作目录并上传相关软件包3.2.2 解压缩相关软件包3.2.3 编写Dockerfile文件3.2.4 编写nginx.conf文件3.2.5 创建nginx镜像3.2.6 运行容器 3.3 部署并配置mysql3.3.1 创建工作目录3.…