node.js学习Day2

目录

1.安装sequelize和mysql2

2.在dao文件下新建dbConnect.js,连接数据库

3.下载dotenv,统一配置环境变量,对第二步的升级补充

4.自定义错误方法,根目录下新建utils文件夹,文件夹下新建文件errors.js

5.根目录下创建model文件夹,model文件夹下创建adminModel.js文件

6.dao文件夹下创建db.js文件

7.下载md5,实现加密


1.安装sequelize和mysql2
npm install --save sequelize mysql2

官网:入门 | Sequelize中文文档 | Sequelize中文网

2.在dao文件下新建dbConnect.js,连接数据库
//dbConnect.js

//连接数据库
const { Sequelize } = require("sequelize")
//创建连接
const sequelize = new Sequelize('mysite', 'root', 'root', {
  host: 'localhost',
  dialect: 'mysql', /* one of 'mysql' | 'postgres' | 'sqlite' | 'mariadb' | 'mssql' | 'db2' | 'snowflake' | 'oracle' */
  logging: false
});
(async function () {
  try {
    await sequelize.authenticate();
    console.log('Connection has been established successfully.');
  } catch (error) {
    console.error('Unable to connect to the database:', error);
  }
}())

//app.js
//引入数据库链接
require("./dao/dbConnect")
3.下载dotenv,统一配置环境变量,对第二步的升级补充
//下载dotenv
npm i dotenv

//app.js,注意放在引入数据库链接的前面
//默认读取项目根目录下.env环境变量
require("dotenv").config();

//.env,写自己的数据库名字,密码什么的
DB_NAME=mysite
DB_USER=root
DB_PASS=root
DB_HOST=localhost

//dbConnect.js
//连接数据库
const { Sequelize } = require("sequelize")
//创建连接
const sequelize = new Sequelize(process.env.DB_NAME, process.env.DB_USER, process.env.DB_PASS, {
  host: process.env.DB_HOST,
  dialect: 'mysql', /* one of 'mysql' | 'postgres' | 'sqlite' | 'mariadb' | 'mssql' | 'db2' | 'snowflake' | 'oracle' */
  logging: false
});
(async function () {
  try {
    await sequelize.authenticate();
    console.log('Connection has been established successfully.');
  } catch (error) {
    console.error('Unable to connect to the database:', error);
  }
}())
4.自定义错误方法,根目录下新建utils文件夹,文件夹下新建文件errors.js
// 自定义错误
class ServiceError extends Error {
  constructor(message, code) {
    super(message);
    this.code = code;
  }
  toResponseJSON() {

  }

}
// throw new ServiceError('aaa', 123);

// 文件上传错误
export class UploadError extends ServiceError {
  constructor(message) {
    super(message, 413);
  }
}
// 禁止访问错误
export class ForbiddenError extends ServiceError {
  constructor(message) {
    super(message, 401);
  }
}
// 验证错误
export class ValidtionError extends ServiceError {
  constructor(message) {
    super(message, 406);
  }
}
// 无资源错误
export class NotFoundError extends ServiceError {
  constructor(message) {
    super("not found", 404);
  }
}
// 未知错误
export class UnKnownError extends ServiceError {
  constructor(message) {
    super("server internal error", 500);
  }
}

module.exports.ServiceError = ServiceError
5.根目录下创建model文件夹,model文件夹下创建adminModel.js文件
const { DataTypes } = require("sequelize");
const sequelize = require("../dao/dbConnect");

// 定义数据模型
module.exports = sequelize.define("admin", {
  loginId: {
    type: DataTypes.STRING,
    allowNull: false
  },
  name: {
    type: DataTypes.STRING,
    allowNull: false
  },
  loginPwd: {
    type: DataTypes.STRING,
    allowNull: false
  },
}, {
  freezeTableName: true,
  createdAt: false,
  updatedAt: false
})
6.dao文件夹下创建db.js文件
// 初始化数据库
const sequelize = require("./dbConnect");
const adminModel = require("../model/adminModel");
const md5 = require("md5");
(async function () {
  //数据模型和表同步
  await sequelize.sync({
    alter: true,
  })

  //初始化数据
  const adminCount = await adminModel.count();
  if (!adminCount) {
    await adminModel.create({
      loginId: 'admin',
      name: 'admin',
      loginPwd: md5("123456")
    })
    console.log("初始化管理员数据完毕...")
  }
  console.log("数据库数据准备完毕...")
})()
7.下载md5,实现加密
npm i md5
//app.js
var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');

var adminRouter = require('./routes/admin');

var app = express();

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/api/admin', adminRouter);

//默认读取项目根目录下.env环境变量
require("dotenv").config();
//引入数据库链接
require("./dao/db")


// catch 404 and forward to error handler
app.use(function (req, res, next) {
  next(createError(404));
});

// error handler
app.use(function (err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【python ASR】win11-从0到1使用funasr实现本地离线音频转文本

文章目录 前言一、前提条件安装环境Python 安装安装依赖,使用工业预训练模型最后安装 - torch1. 安装前查看显卡支持的最高CUDA的版本,以便下载torch 对应的版本的安装包。torch 中的CUDA版本要低于显卡最高的CUDA版本。2. 前往网站下载[Pytorch](https://pytorch.o…

AI驱动无人驾驶:安全与效率能否兼得?

内容概要 如今,人工智能正以其神奇的魔力驱动着无人驾驶的浪潮,带来了无数令人兴奋的可能性。这一领域的最新动态显示,AI技术在车辆的决策过程和实时数据分析中发挥着重要作用,帮助车辆更聪明地应对复杂的交通环境。通过实时监测…

从头开始学PHP之面向对象

首先介绍下最近情况,因为最近入职了且通勤距离较远,导致精力不够了,而且我发现,人一旦上了班,下班之后就不想再进行任何脑力劳动了(对大部分牛马来说,精英除外)。 话不多说进入今天的…

Systemd:现代 Linux 系统服务管理的核心

Systemd:现代 Linux 系统服务管理的核心 引言 Systemd 是一种现代的系统和服务管理器,用于在 Linux 系统启动时初始化用户空间,并通过服务管理和资源控制实现系统的自动化管理。自发布以来,Systemd 已逐渐取代传统的 SysVinit 和…

Linux初阶——线程(Part3):POSIX 信号量 CP 模型变体

一、什么是 POSIX 信号量 信号量本质就是一个统计资源数量的计数器。​​​​​​​ 1、PV 操作 pv操作就是一种让信号量变化的操作。其中 P 操作可以让信号量减 1(如果信号量大于 0),V 操作可以让信号量加 1. 2、信号量类型——sem_t 3…

《女巫攻击:潜伏在网络背后的隐秘威胁与防御策略》

目录 引言 一、基本概念 二、攻击机制 三、Sybil攻击类型 1、直接通信 2、间接通信 3、伪造身份 4、盗用身份 5、同时攻击 6、非同时攻击 四、攻击影响 五、防御措施 总结 引言 随着区块链技术和去中心化网络的迅速发展,网络安全问题也愈发引起关注。其…

Mybatis-plus入门教程

注意版本 jdk 18 springboot 3.1.0 mybatis 3.0.3 mybatisplus 3.5.5 快速入门 构建模块 导入依赖 <properties><maven.compiler.source>18</maven.compiler.source><maven.compiler.target>18</maven.compiler.target><project.build…

插件式模块化软件框架的思想图解一(框架篇)

插件式模块化软件框架的思想图解一&#xff08;框架篇&#xff09; Chapter1 插件式模块化软件框架的思想图解一&#xff08;框架篇&#xff09;一、前述二、模块化原则1、高度独立2、接口规范 三、从管理需求出发四、框架雏形五、接口引用规定六、子模块与代码模板七、把优秀当…

用ChatGPT-o1搞定论文写作!完整的8步指南

学境思源&#xff0c;一键生成论文初稿&#xff1a; AcademicIdeas - 学境思源AI论文写作 使用ChatGPT辅助论文写作可以显著提升效率和质量&#xff0c;关键在于正确的方法和对学术规范的遵守。以下将详细说明完整步骤&#xff0c;并提供ChatGPT的具体操作指南。 1. 确定研究…

LabVIEW继电器视觉检测系统

随着制造业的自动化与高精度要求不断提升&#xff0c;传统的人工检测方法逐渐难以满足高效和高精度的需求。特别是在航空航天、医疗设备等高端领域&#xff0c;密封继电器推动杆部件的质量直接影响到设备的性能与可靠性。LabVIEW自动化视觉检测系统&#xff0c;能对推动杆部件进…

SYN590RH

一般描述 SYN590RH是SYNOXO全新开发设计的一款宽电压范围&#xff0c;低功耗&#xff0c;高性能&#xff0c;无需外置AGC电容&#xff0c;灵敏度达到典型-110 dBm,400MHz~450MHz频率范围应用的单芯片ASK或00 K射频接收器。 SYN590RH是一款典型的即插即用型单片高…

网络编程_day6

目录 【0】复习 并发服务器实现思路梳理 多进程 多线程 IO多路复用select 【1】setsockopt&#xff1a;设置套接字属性 socket属性 设置地址重用 【2】超时检测 必要性 超时检测的设置方法 1. 通过函数自带的参数设置 2. 通过设置套接字属性进行设置 3. alarm函数与sigaction函…

Python Matplotlib:基本图表绘制指南

Python Matplotlib&#xff1a;基本图表绘制指南 Matplotlib 是 Python 中一个非常流行的绘图库&#xff0c;它以简单易用和功能丰富而闻名&#xff0c;适合各种场景的数据可视化需求。在数据分析和数据科学领域&#xff0c;Matplotlib 是我们展示数据的有力工具。本文将详细讲…

在VS中安装chatGPT

2、在VSCode中打开插件窗口 3、输入ChatGPT 4、这里有个ChatGPT中文版&#xff0c;就它了 5、安装 6、这时候侧边栏多了一个chatGPT分页图标&#xff0c;点击它 7、打个招呼 8、好像不行 9、看一下细节描述 10、根据要求按下按下快捷键 Ctrl Shift P 11、切换成国内模式 12、…

使用 ADB 在某个特定时间点点击 Android 设备上的某个按钮

前提条件 安装 ADB&#xff1a;确保你已经在计算机上安装了 Android SDK&#xff08;或单独的 ADB&#xff09;。并将其添加到系统环境变量中&#xff0c;以便你可以在命令行中运行 adb。 USB调试&#xff1a;确保 Android 设备已启用 USB 调试模式。这可以在设备的“设置” -…

一文了解Linux内核I2C子系统,驱动苹果MFI加密芯片

版本 日期 作者 变更表述 1.0 2024/10/27 于忠军 文档创建 背景&#xff1a;由于苹果有一套MFI IAP2的蓝牙私有协议&#xff0c;这个协议是基于BR/EDR的RFCOMM自定义UUID来实现IAP2协议的通信&#xff0c;中间会牵扯到苹果加密芯片的I2C读取&#xff0c;所以我们借此机…

Windows 部署非安装版Redis

1.下载Redis https://github.com/microsoftarchive/redis/releases 选择下载zip包&#xff0c;如Redis-x64-3.0.504.zip&#xff0c;并解压 2.启动非安装版redis服务 进入到redis目录&#xff0c;打开cmd 执行命令 redis-server.exe redis.windows.conf 3.登录redis客户端…

多个玩家在线游戏

这张图片列出了多人游戏的两种主要网络架构类型&#xff1a; 1. Peer-to-Peer (P2P)&#xff1a; 点对点网络&#xff0c;其中每个玩家的游戏客户端直接与其他玩家的游戏客户端通信。这种架构通常用于小型或中型规模的多人游戏。 2. Client-Server&#xff1a; 客户端-服务器…

JavaIO流操作

目录 简介 字节输入流 获取字节输入流 读 关闭输入流 字节输出流 获取字节输出流 写 换行符 刷新 关闭输出流 字符流输入流 获取字符输入流 读 关闭输入流 字符输出流 获取字符输出流 写 换行符 刷新 关闭输出流 简介 IO流分为两大派系&#xff1a; …

并查集与LRUCache(Java数据结构)

前言&#xff1a; 学习过二叉树之后就应该知道了如何构建一颗二叉树&#xff0c;双亲结点和孩子节点的关系&#xff0c;甚至可以放在顺序表中去构建一棵二叉树&#xff01; 接下来我们要以另一种方式去组织一棵树&#xff1a; 如何表示一棵树之间的关系&#xff1f;(这棵…