基于express+TS+mysql+sequelize的后端开发环境搭建

步骤一:初始化node环境

npm init -y

 步骤二:安装 Express、TypeScript、以及相关类型的定义文件

npm install express

npm install --save-dev typescript @types/node @types/express ts-node nodemon

npm install body-parser

npm install mysql2

npm install sequelize

 步骤三:初始化ts文件配置

创建 tsconfig.json 文件来配置 TypeScript 编译选项:

{"compilerOptions": {"target": "ES6","module": "commonjs","strict": true,"esModuleInterop": true,"skipLibCheck": true,"forceConsistentCasingInFileNames": true,"outDir": "./dist"},"include": ["src/**/*.ts"],"exclude": ["node_modules"]
}

步骤四:初始化启动类

import express from 'express';
import path from 'path';
//解析json字符串
import bodyParser from 'body-parser';class Main {private app: express.Application;private port: number;constructor(port: number) {this.app = express();this.app.use(bodyParser.json()).use(bodyParser.urlencoded({ extended: true }));this.port = port;this.getStaticData();}public start(): void {this.app.listen(this.port, () => {console.log(`服务器已启动!`);});}public use(router: express.Router, api?: string): Main {if (api) {this.app.use(api, router);} else {this.app.use(router);}return this;}private getStaticData(): void {this.app.use('/static', express.static(path.join(__dirname, './static')));console.log('静态资源已加载');}getApp(): express.Application {return this.app;}
}const main = new Main(8080);main.start();

步骤五:初始化mysql工具文件

import { Sequelize } from 'sequelize';const sequelize = new Sequelize("sd_ai_db","root","root",{host:"localhost",dialect:"mysql",timezone: '+08:00',//配置连接池pool:{max:5,min:0,idle: 10 * 1000,}
});sequelize.authenticate().then(() => {console.log('数据库连接成功');
}).catch(err => {console.error('数据库连接失败:', err);
});export default sequelize;

步骤六:编写示例服务器接口

web层:
import express, { Request, Response } from 'express'; 
import { HelloService } from '../service/HelloService';
import helloService from '../service/HelloService';
import Result from '../model/Result';class HelloWeb {private router: express.Router;private helloService: HelloService;constructor() {this.router = express.Router();this.helloService = helloService;//注册接口this.lookStartInfo();console.log("HelloWeb初始化完毕");}public getRouter(): express.Router {return this.router;}/*** 找到服务器的全部启动记录*/private lookStartInfo(): void {this.router.get('/lookStartInfo', async (req: Request, res: Response) => {const data = await this.helloService.lookStartInfo();res.json(new Result(200, "查询成功", data));})}
}//导出接口
export default new HelloWeb().getRouter();
service层:
import HelloDao from "../dao/HelloDao";class HelloService {constructor() {this.startService();console.log("HelloService加载完毕");}public async startService(): Promise<any> {return await HelloDao.create({})}public async lookStartInfo(): Promise<any> {const data = await HelloDao.findAll();return data;}}export default new HelloService();export { HelloService };
dao层:
import { INTEGER, Model } from 'sequelize';
import mysql from '../utils/mysql';class HelloDao extends Model{}HelloDao.init({id: {type: INTEGER,primaryKey: true,autoIncrement: true}
},{sequelize:mysql,tableName: 'systems',modelName: 'system',timestamps: true
})//初始化表结构
HelloDao.sync({force:false}).then(()=>{console.log('system表初始化成功');
}).catch(()=>{console.log('system表初始化失败');
})export default HelloDao;
model类: 
class Result {private code: number;private msg: string;private data: any;constructor(code: number, msg: string, data: any) {this.code = code;this.msg = msg;this.data = data;}public getCode(): number {return this.code;}public getMsg(): string {return this.msg;}public getData(): any {return this.data;}
}export default Result;

将接口配置到index.ts中:

import express from 'express';
import path from 'path';
//解析json字符串
import bodyParser from 'body-parser';
//引入Hello接口
import Hello from './web/HelloWeb';class Main {private app: express.Application;private port: number;constructor(port: number) {this.app = express();this.app.use(bodyParser.json()).use(bodyParser.urlencoded({ extended: true }));this.port = port;this.getStaticData();}public start(): void {this.app.listen(this.port, () => {console.log(`服务器已启动!`);});}public use(router: express.Router, api?: string): Main {if (api) {this.app.use(api, router);} else {this.app.use(router);}return this;}private getStaticData(): void {this.app.use('/static', express.static(path.join(__dirname, './static')));console.log('静态资源已加载');}getApp(): express.Application {return this.app;}
}const main = new Main(8080);//引入模块
main.use(Hello, '/api');//启动服务器
main.start();

 步骤七:编写启动脚本命令

编辑package.json中的scripts启动命令,编辑完成后大概是这样:

{"name": "back","version": "1.0.0","description": "","main": "index.js","scripts": {"start": "ts-node src/index.ts","dev": "nodemon src/index.ts"},"keywords": [],"author": "","license": "ISC","dependencies": {"body-parser": "^1.20.3","express": "^4.21.2","mysql2": "^3.13.0","sequelize": "^6.37.6"},"devDependencies": {"@types/express": "^5.0.0","@types/node": "^22.13.10","nodemon": "^3.1.9","ts-node": "^10.9.2","typescript": "^5.8.2"}
}

步骤八:启动服务器

npm run dev(可以一直启动,修改代码后不用重启)

npm run start

结果:

 

补充:项目文件结构 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蓝耘MaaS平台:阿里QWQ应用拓展与调参实践

摘要&#xff1a;本文深入探讨了蓝耘MaaS平台与阿里QWQ模型的结合&#xff0c;从平台架构、模型特点到应用拓展和调参实践进行了全面分析。蓝耘平台凭借其强大的算力支持、弹性资源调度和全栈服务&#xff0c;为QWQ模型的高效部署提供了理想环境。通过细化语义描述、调整推理参…

2. qt写带有槽的登录界面(c++)

我们在1.Qt写简单的登录界面(c)_c qt 设计一个简单界面-CSDN博客中写了个简单的登录界面&#xff0c;但没有槽&#xff0c;在这里写一个带有槽的界面。 1.代码 代码目录如下&#xff1a; main.cpp的代码如下&#xff1a; #include "MainWindow.h" #include <Qt…

linux - 基础IO之操作与文件描述符全解析:从C语言到系统调用底层实现

目录 1.回顾c语言中所学的文件 2.提炼对文件的理解&#xff08;linux基础io第一阶段的学习&#xff09; a.在操作系统内部&#xff0c;一个进程和一个被打开的文件&#xff0c;他们到后面会变成两种对象之间的指针关系。 b.文件 属性 内容 c.在c语言中,以w的方式打开文件…

【A2DP】深入解读A2DP中通用访问配置文件(GAP)的互操作性要求

目录 一、模式支持要求 1.1 发现模式 1.2 连接模式 1.3 绑定模式 1.4 模式间依赖关系总结 1.5 注意事项 1.6 协议设计深层逻辑 二、安全机制&#xff08;Security Aspects&#xff09; 三、空闲模式操作&#xff08;Idle Mode Procedures&#xff09; 3.1 支持要求 …

python 入门教程 window 10 环境下安装pyenv

python的环境配置方法很多&#xff0c;由于python有两个大版本&#xff0c;很多时候需要切换某个固定的版本才能运行三方包&#xff0c;所以推荐使用pyenv 配置python 环境变量 pyenv 的安装 安装方法&#xff1a; Invoke-WebRequest -UseBasicParsing -Uri "https://r…

【fNIRS可视化学习1】基于NIRS-SPM进行光极可视化并计算通道坐标

一、前言 功能性近红外光谱(fNIRS)是一种无创的脑功能成像技术。在fNIRS研究中&#xff0c;光极的空间定位和通道坐标的计算至关重要。 1.光极可视化 光极可视化的重要性我就不赘述了&#xff0c;它可以直观检查probe设计的合理性&#xff0c;确认光极覆盖目标脑区&#xff0c…

Vue.js 中 class 和 style 绑定的全面解析

目录 引言 6.1 v-bind 指令 介绍 使用方法 6.2 绑定 HTML class 介绍 用法 6.3 绑定内联样式 介绍 用法 6.4 实战&#xff1a;制作消息提示框 介绍 用法 总结 引言 在Vue.js构建用户界面的宏伟蓝图里&#xff0c;样式的动态呈现与交互性的完美融合是吸引用户目光…

【红黑树】—— 我与C++的不解之缘(二十五)

前言 学习了avl树&#xff0c;现在来学习红黑树。 一、什么是红黑树 红黑树是一颗平衡二叉搜索树&#xff0c;它每一个节点增加了一个存储位表示节点的颜色&#xff0c;可以是红色或者黑色。 相比较于AVL树&#xff0c;红黑树也是一个自平衡二叉搜索树&#xff0c;但是它与AVL树…

SFT数据处理部分的思考

SFT数据及处理的业内共识 1&#xff0e;prompt的质量和多样性远重要于数据量级&#xff0c;微调一个 30 b 量级的base model只需要 10 w 量级的数据即可 参考&#xff1a;《LIMA&#xff1a;Less Is More for Alignment》 2&#xff0e;合成数据很重要&#xff01;一般需要通过…

Python(学习一)

做网站有成熟的框架像FLASK、DJANGO、TORNADO&#xff0c;写爬虫有好用到哭的REQUESTS&#xff0c;还有强大到没盆友的SCRAPY 随着NUMPY、SCIPY、MATLOTLIB等众多第三方模块的开发和完善&#xff0c;不仅支持py支持各种数学运算&#xff0c;还可以绘制高质量的2D和3D图像&…

ArcGIS Pro将有文字标注底图切换为无标注底图(在线地图图源)

今天介绍一下在ArcGIS Pro将有标注的地形底图换成无标注的底图。 大家在这项目底图时候会经常调用ArcGIS Pro自带的地形图&#xff0c;但是这个地形图自带是有注记的&#xff0c;如下图。 如何更改&#xff0c;才可以调用无文字注记的呢&#xff1f; 对于一个已经切好图的有注记…

Linux第三次练习

1、创建根目录结构中的所有的普通文件 首先在根目录下面新创建一个test目录&#xff0c;然后将查找到的普通文件新建到test目录下 2、列出所有账号的账号名 3、将/etc/passwd中内容按照冒号隔开的第三个字符从大到小排序后输出所有内容 4、列出/etc/passwd中的第20行-25行内容…

[CISCN 2022 初赛]ezpop(没成功复现)

打开在线环境可以看到&#xff1a; 记得之前做过一个类似的就是有点像照着漏洞去复现。应该可以直接在网上找到链子去打。 www.zip查看路由是 Index/test&#xff0c;然后 post 传参 a&#xff1a; exp&#xff08;参考了别的大神的wp&#xff09;&#xff1a; <?php //…

技术-NBIOT

是什么&#xff1f; 窄带物联网&#xff08;Narrow Band Internet of Things, NB-IoT&#xff09;成为万物互联网络的一个重要分支支持低功耗设备在广域网的蜂窝数据连接&#xff0c;也被叫作低功耗广域网(LPWAN)NB-IoT支持待机时间长、对网络连接要求较高设备的高效连接NB-Io…

Spring @Bean注解使用场景二

bean:最近在写一篇让Successfactors顾问都能搞明白的sso的逻辑的文章&#xff0c;所以一致在研究IAS的saml2.0的协议&#xff0c;希望用代码去解释SP、idp的一些概念&#xff0c;让顾问了解SSO与saml的关系&#xff0c;在github找代码的时候发现一些代码的调用关系很难理解&…

pip install和conda install的区别

这里写目录标题 一、什么是 Python 依赖&#xff08;Python Dependencies&#xff09;&#xff1f;1. 依赖的作用2. 如何管理 Python 依赖3. 依赖管理问题4. 依赖锁定总结 二、使用pip安装包venv隔离环境方法 1&#xff1a;使用 venv&#xff08;推荐&#xff09;创建虚拟环境激…

R语言高效数据处理-自定义EXCEL数据排版

注&#xff1a;以下代码均为实际数据处理中的笔记摘录&#xff0c;所以很零散 1、自定义excel表数据输出格式、布局 在实际数据处理中为了提升效率&#xff0c;将Excel报表交付给需求方时减少手动调整的环节很有必要 #1.1设置表头格式 header_style <- createStyle(font…

Word 小黑第4套

对应大猫41 上下日期是一起变动的&#xff0c;删掉第一个&#xff0c;第二个日期格式&#xff08;文件 -选项 -自定义功能区 -选上开发工具&#xff09; 点开发工具 -属性 选择相应的日期格式&#xff09; 修改标题样式时&#xff0c;标题三只有点标题二时才会显示 右击正文样…

酒店宾馆IPTV数字电视系统:创新宾客体验,引领智慧服务新潮流

酒店宾馆IPTV数字电视系统&#xff1a;创新宾客体验&#xff0c;引领智慧服务新潮流 北京海特伟业科技有限公司任洪卓于2025年3月15日发布 随着智慧酒店的不断发展&#xff0c;宾客对于酒店内的娱乐和信息服务需求日益多样化&#xff0c;传统的电视服务已难以满足现代宾客的高…

jupyter无法转换为PDF,HTMLnbconvert failed: Pandoc wasn‘t found.

无法转为PDF 手动下载工具 https://github.com/jgm/pandoc/releases/tag/3.6.3 似乎跟我想的不大一样&#xff0c;还有新的报错 https://nbconvert.readthedocs.io/en/latest/install.html#installing-tex 不知道下的啥玩意儿 sudo apt-get install texlive-xetex texlive-fon…