koa ts kick off 搭建项目的基本架子
koa ts kick off 使用ts开发koa项目的基本架子,便于平时随手调研一些技术
项目结构
├── src
│ ├── controller //controller层
│ ├── service //service层
│ ├── routes.ts //路由
│ └── index.ts //项目入口index.js
├── ecosystem.config.js //pm2配置
├── nodemon.json //nodemon配置
├── package.json
└── tsconfig.json // ts配置文件
项目构建步骤
初始化项目
npm init
按需输入信息,或者一直回车即可,信息可以后面再package.json中补充
安装typescript相关依赖
npm i ts-node typescript --save-dev
- ts-node: 可以在node中使用ts
- typescript: ts的包
配置tsconfig
先初始化ts配置文件,执行下面命令
npx tsc --init
执行完上述命令后生成tsconfig.json配置文件。
该项目将tsconfig配置为下面内容
{"include": ["./src"], // 指定需要编译文件 否则默认当前目录下除了exclude之外的所有.ts, .d.ts,.tsx 文件"compilerOptions": {"module": "commonjs", // 指定生成哪个模块系统代码"declaration": false,"removeComments": true,"emitDecoratorMetadata": true,"experimentalDecorators": true,"target": "es6","sourceMap": false, // 用于debug "outDir": "./dist", //重定向输出目录"baseUrl": "./"},"exclude": ["node_modules"] // 不编译某些文件
}
有关ts的详细内容推荐: ts学习好资料
关于tsconfig的完整参数文档:
中文文档
英文文档
安装koa等基础功能包
npm i koa koa-router koa-body koa-parameter koa-static @types/node
- koa:koa功能包
- koa-router:koa路由
- koa-body: 解析post等请求中body参数
- koa-parameter: 校验请求中的基本参数
- koa-static: 静态文件服务
- @types/node: 包含node包中大部分的定义
项目基本内容
安装项目结构,分别建立各自文件夹,这里使用一个controller 和一个service
入口文件
src/index.ts
import * as Koa from 'koa';
import * as path from 'path';
import * as koaStatic from "koa-static";
import { koaBody } from 'koa-body';
import * as parameter from 'koa-parameter';
import globalExceptionHandler from './middleware/exceptions';
import router from './router';// koa应用
const app = new Koa();
// 注册中间件
// 全局捕获错误
app.use(globalExceptionHandler);
// 静态文件服务 public 文件夹下文件可对外访问
app.use(koaStatic(path.join(__dirname, 'public')));
// 解析body 参数
app.use(koaBody());
// 验证入参
app.use(parameter(app));
// 注册路由
app.use(router.routes());
// 如果请求了不被允许的方法 比如说只实现了 get 这时候请求了post 就会告诉客户端一些信息
app.use(router.allowedMethods());
app.listen(3009, () => console.log('程序已经在3009端口启动'));
路由
src/router中内容用于应用中的路由注册
import * as Router from 'koa-router';
import HelloController from './controller/hello';const router = new Router();
router.get('/hello', HelloController.hello);
router.post('/sayHey', HelloController.sayHey);export default router;
中间件
src/middleware/exceptions.ts 中间件用于全局兜底使用捕获异常
// global exception handler
const globalExceptionHandler = async (ctx, next) => {try {await next();} catch (error) {ctx.body = {errMsg: error.message,state: false};ctx.status = 200; // http 响应码}
};export default globalExceptionHandler;
controller层
src/controller/hello.ts 一个简单的controller层
import HelloService from '../service//hello';
class HelloController {private service: HelloService = new HelloService();hello = async ctx => {const params = ctx.request.query;console.log(`接受到的参数为, name:${params.name}`);ctx.body = await this.service.hello();};sayHey = async ctx => {const params = ctx.request.body;ctx.verifyParams({// 登录信息loginUrl: { type: 'string', required: true },});ctx.body = `接受到的数据, name:${params.name} age: ${params.age}`;};}
export default new HelloController();
service层
src/service/hello.ts 一个简单的service层
export default class HelloService {hello = () => {return 'hello koa ts world ~';};
}
配置eslint
现在一般使用eslint来校验ts即可,无需再使用tslint。两者基本重复,tslint也不再维护了,推荐使用eslint即可
安装eslint
npm i eslint --save-dev
初始化eslint配置文件
npx eslint --init
执行上面命令后,会有一些列的交互式问题,按需选择即可。会自动下载对应的npm包并在本地生成.eslintrc.json配置文件
安装一个解析器,一个将 TypeScript 转换为与 ESTree 兼容的形式的解析器
npm i @typescript-eslint/parser
配置.eslintrc.json
这里将其配置为如下内容
{"root": true,"parser": "@typescript-eslint/parser","plugins": ["@typescript-eslint"],"extends": ["eslint:recommended","plugin:@typescript-eslint/eslint-recommended","plugin:@typescript-eslint/recommended"],"rules": { "semi": [2, "always"],"no-console": 1 // 如果有console,会抛出错误}
}
eslintignore.json
touch .eslintignore
忽略不需要eslint校验的文件配置内容如下:
node_modules
dist
ecosystem.config.js
nodemon
一个很不错的工具包,可以监听本地文件服务的变化,自动重启服务,代替node命令
安装
npm i nodemon --save-dev
配置文件
在根目录下新建nodemon.json文件,修改内容如下:
{"watch": ["src"], // 监听src文件夹"ext": "ts", // 监听ts文件"exec": "ts-node src/index.ts", // 变化之后执行该命令"ignore": ["./src/public"] // 忽略那些命令
}
上述配置是监听src文件夹中
配置script脚本
在package.json文件中新增一个dev命令,表开发时使用
"dev": "nodemon",
当执行 npm run dev / yarn dev 时,会根据nodemon.json配置文件执行命令
pm2
在生产环境使用pm2来守护应用进程
安装
npm i pm2 --save-dev
配置文件
npx pm2 init
执行上述命令生成pm2配置文件ecosystem.config.js, 将其修改为如下内容:
// pm2 配置文件,可运行 pm2 init生成该配置文件
const { name } = require('./package.json');
const path = require('path');module.exports = {apps: [// 数组中每一项都是运行在pm2中的一个应用{// pm2中应用程序的名称name,// 应用的入口文件script: path.resolve(__dirname, './dist/index.js'),// 该应用创建的实例,可以根据服务器的cpu数量来设置实例,以充分利用机器性能.仅在cluster模式有效,默认为fork;// instances: require('os').cpus().length,instances: 1,// 发生异常的情况下自动重启autorestart: true,// 是否启用监控模式,默认是false。如果设置成true,当应用程序变动时,pm2会自动重载。这里也可以设置你要监控的文件watch: true,env_production: {NODE_ENV: 'production',PORT: 8080},}]
};
配置script命令
在package.json中我们配置如下脚本
"scripts": {"dev": "nodemon", // 开发调式时使用"dev:dist": " nodemon dist/index.js", // 调试构建出的dist包"build": "rm -rf dist && tsc", // 构建生产包"cp": "cp -r src/public dist/public", // tsc 只会讲src中ts文件编译成js到dist中,public静态资源文件单独cp过去"start": "npm run build && npm run cp && npx pm2 start ecosystem.config.js --env production", // 生产环境运行"restart": "npx pm2 restart ecosystem.config.js --env production", //生产环境重启"stop": "npx pm2 stop ecosystem.config.js", // 停止生产环境应用进程"delete": "npx pm2 delete ecosystem.config.js", // 删除生产环境应用进程"lint": "eslint . --ext .ts", // eslint校验项目代码规范"lint:fix": "eslint . --ext .ts --fix", // eslint校验 & 修复项目代码规范"test": "echo \"Error: no test specified\" && exit 1"},
.gitignore
配置提交git时忽略的文件
node_modules
dist
运行
// 安装依赖
npm i// 开发调式
npm run dev// 生产
npm run start
项目地址
github地址
相关文章:

koa ts kick off 搭建项目的基本架子
koa ts kick off 使用ts开发koa项目的基本架子,便于平时随手调研一些技术 项目结构 ├── src │ ├── controller //controller层 │ ├── service //service层 │ ├── routes.ts //路由 │ └── index.ts //项目入…...
h2database源码解析-查询优化器原理
目录一、成本计算规则二、单表查询三、多表关联查询一、成本计算规则 h2的查询优化器基于成本的,因此在执行查询前,会基于成本计算使用哪个索引,如果涉及多表关联,还会计算不同表关联顺序的成本,最终基于最小成本得出…...
2月11日,30秒知全网,精选7个热点
///国产邮轮首制船将于今年5月底出坞,年底交付 浦东新区近期将发布相关政策支持包括外高桥造船在内的船舶产业发展 ///首批个人养老金理财产品名单发布:3家机构7只产品 中国理财网发布的信息显示,首批个人养老金理财产品名单发布࿰…...
vue组件的构成 <template> <script> <style>节点的使用 <
1.vue组件组成结构 每个.vue组件都由3部分构成,分别是: template ->组件的模板结构script ->组件的JavaScript行为style ->组件的样式 其中,每个组件中必须包含template模板结构,而script行为和style样式是可选的组成部分。 2.组…...

windows + vscode + rust
1 安装VSCODE略2 安装rust插件1、说明:第4步本人是一个一个点击状态。上图禁用按钮在没装之前是显示“安装”按钮,应该点击“安装”也可以。2、还需要安装C插件,搜索C即可,装微软的3 创建rust工程由于初次使用,不知道目…...

二十九、异常处理
目录 ①前言: ②常见的运行时异常 ③常见的编译时异常 ④异常的处理机制 ⑤自定义异常 ①前言: 1.什么是异常? 异常是程序在“编译”或者“执行”的过程中可能出现的问题,注意:语法错误不算在异常体系中。 比如: 数据索引越界异常&…...

RTOS之二环境搭建初识RTOS
参考:https://blog.csdn.net/kouxi1/article/details/123650688视频:https://www.bilibili.com/video/BV1b14y1c783/RTOS本质就是切换线程栈,栈换了环境就换了,一个重要的结构tcb(linux叫PCB或thread_info)…...

【Java】 JAVA Notes
JAVA语言帮助笔记Java的安装与JDKJava命名规范JAVA的数据类型自动类型转换强制类型转换JAVA的运算符取余运算结果的符号逻辑运算的短路运算三元运算符运算符优先级JAVA的流程控制分支结构JAVA类Scanner类Math 类random方法获取随机数Java的安装与JDK JDK安装网站:h…...

Java笔记-volatile和AtomicInteger
目录1. volatile1.1.什么是volatile1.2.JMM-Java内存模型2 验证volatile的特性2.1 可见性2.2.验证volatile不保证原子性2.3 volatile实现禁止指令重排序3.使用AtomicInteger解决volatile的不能实现原子性的问题3.2 AtomicInteger的方法说明:3.3 CAS3.4 应用1. volat…...

[标准库]STM32F103R8T6 高级定时器--PWM输出和带死区互补PWM输出
前言 STM32F103系列的MCU,相比普通的51单片机,在输出硬件PWM这个功能上要强不少,两者实现的方式都类似,都是通过一个定时器来启用硬件PWM输出,不过在输出PWM通道的数量上,32F103要强上不少。仅通过一个高级…...

Camtasia2023最新版电脑视频录屏记录编辑软件
在Mac或Wind上有各种可用的视频记录和编辑软件,其中Camtasia被称为视频记录器和视频编辑器。录屏软件Camtasia2023到底有什么特色功能?本文将帮助您选择理想的选择来开始视频捕获,创建和编辑。Camtasia2023是Mac/win平台上一款使用非常简单的…...
管理用户安全性
每个数据库用户帐户都包括以下项:唯一的用户名验证方法 默认表空间临时表空间用户概要文件初始使用者组帐户状态验证用户口令验证、外部验证、全局验证管理员验证操作系统安全性:• DBA 必须具有创建或删除文件的操作系统权限。• 普通数据库用户不应具有…...

分享113个JS菜单导航,总有一款适合您
分享113个JS菜单导航,总有一款适合您 113个JS菜单导航下载链接:https://pan.baidu.com/s/1d4nnh-UAxNnSp9kfMBmPAw?pwdcw23 提取码:cw23 Python采集代码下载链接:https://wwgn.lanzoul.com/iKGwb0kye3wj base_url "http…...

RuoYi-Cloud 部署
RuoYi-Cloud部署 1. 下载 点击右侧链接可以进入gitee的源码下载地址: 偌依微服务源码gitee下载地址 2. 数据库部署 依据如下步骤创建系统所需数据环境,脚本执行没有先后次序要求: 在Mysql 中创建 ry-cloud 主数据库,并执行 …...
DockerFile文件详解
一、DockerFile文件说明1、概述 Dockerfile是用来构建Docker镜像的文本文件,文本内容包含了一条条构建镜像所需的指令、参数和说明。可以在Docker文件中使用RUN,CMD,FROM,EXPOSE,ENV等指令。即:Dockerfile仅…...

Java程序运行机制
Java语言既具有编译型语言的特征,又具有解释型语言的特征,Java程序要经过先编译后解释两个阶段。高级语言的运行机制📍编译型语言使用专门的编译器,针对特定的平台(移植性差),将高级语言的源代码…...

LeetCode刷题------字符串
目录 LeetCode:344.反转字符串 LeetCode:541. 反转字符串II LeetCode:剑指Offer 05.替换空格 LeetCode:151.翻转字符串里的单词 LeetCode:剑指Offer58-II.左旋转字符串 LeetCode:28. 实现 strStr() …...

区块链技术与应用2——BTC-数据结构
文章目录比特币中的数据结构1. 区块链(block chain)2. 默克尔树(Merkle tree)3.哈希指针的问题比特币中的数据结构 1. 区块链(block chain) 哈希指针: (1)保存数值的位置…...

BiseNet v1论文及其代码详解
来源:投稿 作者:蓬蓬奇 编辑:学姐 BiSeNet v1说明: 文章链接:https://arxiv.org/abs/1808.00897 官方开源代码:https://github.com/CoinCheung/BiSeNet (本文未使用) 文章标题&am…...

(超详细)Navicat的安装和激活,亲测有效
步骤一:准备安装包 下载Navicat,我用的v15最好一致(私信可以发你安装包和注册码)步骤二:关闭杀毒软件,然后需要断掉网络(一定断网) 步骤三:一路next安装,安装…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...

关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...