trello01:后端的搭建
文章目录
- 1 技术栈
- 1-1 开发依赖
- 1-2 开发工具
- 2 接口规范
- 2-1 资源路径
- 2-2 其它规范
- 获取
- 创建
- 更新
- 删除
- 2-3 错误处理
- 请求错误
- 授权验证错误
- 3 基础搭建
- 3-1 项目基础目录结构
- 初始化
- ts 配置
- 创建源码目录
- 创建项目主入口文件
- 创建项目配置文件目录及文件
- 类型声明文件
- 3-2 入口文件
- 安装 Koa
- 安装 Koa 类型声明文件
- 编写基本代码
- 3-3 应用启动
- 安装
- 配置&启动
- 3-4 koa-ts-controllers
- 4 koa-ts-controllers
- 4-1 对比
- 安装路由
- **koa-ts-controllers**
- 4-2 安装与配置
- bootstrapControllers
- 配置选项
- router
- basePath
- versions
- controllers
- 4-3 控制器
- 4-4 装饰器
- Controller 装饰器
- HTTP请求方法装饰器
- 代码实例
- 出现未找到`class-validator`的错误
1 技术栈
1-1 开发依赖
koa
后端的主框架。koa-router
基于Koa
的路由。koa-static-cache
koa
静态文件代理。koa-ts-controllers
基于Koa
和TypeScript
构建的路由控制系统,它提供了各种装饰器来构建RESTful
风格的API
。mysql2
NodeJS
连接操作MySQL
的库。sequelize
一个功能更丰富和强大的数据库操作库,支持MySQL
、MSSQL
、SQLite
等数据库,提供了ORM
、事务
以及Promise
等支持。sequelize-typescript
sequelize
的TypeScript
版class-validator
基于validator.js
和TypeScript
的数据验证工具,对用户或者接口调用传入的数据进行校验。jsonwebtoken
JWT
鉴权库。moment
日期时间处理工具。
1-2 开发工具
这一部分主要是一些辅助工具,比如:Sequelize-cli
等。
ts-node-dev
ts-node
的dev
版,实现了热重载(修改代码即可自动重启服务)。sequelize-cli
sequelize
提供了的CLI
工具,可以通过它来维护数据库。
注意:一定要注意所使用的框架与库的版本,不同的版本或多或少都会存在差异,如果有什么问题,记得确认下是否是因为版本差异所带来的。
2 接口规范
在接口规范方面,我们遵循 RESTful
规范,合理的利用 请求方法
、状态码
等来设计 API
,参考如下:
2-1 资源路径
因为当前应用没有把接口数据与静态资源(如图片等)进行分开放置,所以为了进行区分,接口以 /api
作为前缀,静态资源以 /public
作为前缀。
为了更方便的对接口进行管理以及后续的升级,路径后同时携带当前接口的版本,如:/api/v1/signin
2-2 其它规范
获取
请求方法:GET
响应状态码:200
响应主体:被请求的资源内容
[{"id": 1,"name": "zhangsan"},{"id": 2,"name": "lisi"}
]
创建
请求方法:POST
响应状态码:201
响应主体:被创建的资源内容
{"id": 3,"name": "wangwu"
}
更新
请求方法:PUT
响应状态码:204
响应主体:无
删除
请求方法:DELETE
响应状态码:204
响应主体:无
2-3 错误处理
应用中的错误会返回对应的状态码,主要有:
请求错误
资源不存在:404
请求参数异常:422
授权验证错误
没有授权/登陆:401
禁止访问:403
{// 状态码"statusCode": 422,// 状态码对应描述"error": "Unprocessable Entity",// 错误信息"message": "validation error for argument type: body",// 错误详情"errorDetails": [{"field": "age","violations": {"isNumber": "年龄必须为数字"}}]
}
3 基础搭建
3-1 项目基础目录结构
初始化
创建项目目录 backend
,并通过 npm init
进行初始化。
ts 配置
根目录创建 ts 配置文件:tsconfig.json
,配置如下:
// file: backend/tsconfig.json
{"compilerOptions": {"outDir": "./dist","module": "CommonJS","target": "ES6","sourceMap": true, // 把 ts 文件编译成 js 文件的时候,同时生成对应的 map 文件"noImplicitAny": true, // 隐式索引错,TypeScript 编译器无法推断出类型时,它仍然会生成 JavaScript 文件"strictNullChecks": true, // 严格null类型检查"allowJs": true, // 允许js模块"resolveJsonModule": true, // 允许Json模块"esModuleInterop": true, // 处理非ts import模块化的问题"allowSyntheticDefaultImports": true, // 解决一些默认导出问题"experimentalDecorators": true, // 装饰器特性"emitDecoratorMetadata": true, // 元数据},"include": ["./src/**/*"]
}
创建源码目录
根目录下创建 src
目录,作为我们的源码存放目录。
创建项目主入口文件
src
目录下创建项目启动入口文件:app.ts
。
创建项目配置文件目录及文件
项目中会用到许多的一些动态可变数据,比如不同环境下(开发、测试、生成等)主机地址,端口,数据库连接信息等。我们在 src
目录下创建一个 configs
目录,并在该目录下创建配置文件:index.ts
,先写入以下基本信息,后续会根据需求再进行增加:
// file: backend/src/configs/index.ts
const configs = {development: {server: {host: 'localhost',port: 8080}},test: {server: {host: 'localhost',port: 8080}},production: {server: {host: 'localhost',port: 8080}}
}type configs = typeof configs;
type configKeys = keyof configs;const NODE_ENV = process.env.NODE_ENV as configKeys || 'development';export default configs[NODE_ENV];
类型声明文件
默认情况下,TypeScript
没有内置 node
相关的类型声明,我们需要手动安装:
npm i -D @types/node
现在就不报错了
下面报错是ts的类型提示,无法确定NODE_ENV的具体类型
这时声明一个type
来约束NODE_ENV类型
或者使用 keyof typeof 形式来提高可扩展性
type configsKeys = keyof typeof configs;
3-2 入口文件
安装 Koa
npm i koa
安装 Koa 类型声明文件
因为 Koa
并不是 TS
编写的,且官方包中也没有提供对应的类型声明文件,引用koa的时候就会报错
所以我们需要单独安装
npm i -D @types/koa
编写基本代码
// file: backend/src/app.ts
import configs from './configs';
import Koa from 'koa';const app = new Koa();app.listen(configs.server.port, configs.server.host, () => {console.log(`服务启动成功: http://${configs.server.host}:${configs.server.port}`);
});
3-3 应用启动
在开发阶段,我们可以通过 ts-node-dev
工具来直接帮助我们编译并运行 ts
文件,同时它还有热重启的功能。
安装
npm i -D ts-node-dev
// 同时因为 ts-node-dev 需要编译ts,所以还需要安装 typescript
npm i -D typescript
配置&启动
为了方便启动,在package.json
中配置启动命令
// file: backend/package.json{//...,"scripts": {//...,"dev": "ts-node-dev ./src/app.ts"},//...
}
npm run dev
3-4 koa-ts-controllers
我们的项目使用的是 TypeScript
进行的开发,需要了解一下各种技术在开发中的使用与技巧。
比如这里,我选择了一个基于 TypeScript
的路由控制框架:koa-ts-controllers
4 koa-ts-controllers
4-1 对比
在原来的 Koa
路由配置中,我们是通过 koa-router
进行集中注册管理的方式来绑定路由的
安装路由
npm i koa-router
// 类型声明文件
npm i -D @types/koa-router
代码如下:
// file: backend/src/app.ts
const Koa = require('koa');
const KoaRouter = require('koa-router');const app = new Koa();
const router = new KoaRouter();// 调用 router 下的 get、post 等,绑定路由函数
// 其中的 main、signUp、signIn 函数可以写在外部独立文件中,然后这里通过导入
router.get('/', main);
router.post('/signup', signUp);
router.post('/signin', signIn);
// ......// 注册路由到koa中间件
app.use( Router.routes() );
app.listen(80);
koa-ts-controllers
在 koa-ts-controllers
中,利用了 TypeScript
的装饰器,我们可以直接在指定类的某个方法中对其进行路由绑定。
而且通过它提供的功能,我们可以更方便就能实现更符合 RESTful
规范的接口。
下面看具体的使用:
4-2 安装与配置
首先需要安装 koa-ts-controllers
及其其它依赖库。
npm i koa-ts-controllers
// koa-ts-controllers 本身就是 ts 的,不需要安装独立类型声明文件。
入口文件添加代码:
// file: backend/src/app.ts
// ...import {bootstrapControllers} from 'koa-ts-controllers';
import path from 'path';
import KoaRouter from 'koa-router';const app = new Koa();
const router = new KoaRouter();(async () => {await bootstrapControllers(app, {router: router,basePath: '/api',versions: [1],controllers: [__dirname + '/controllers/**/*']});app.use( router.routes() );app.listen(configs.server.port, configs.server.host, () => {console.log(`访问启动成功: http://${configs.server.host}:${configs.server.port}`);});
})()
bootstrapControllers
koa-ts-controllers
的主要函数,用来初始化应用控制器和路由绑定。
配置
配置选项
router
使用的路由库。
basePath
设置访问接口路径的前缀,/api
。
versions
接口版本,会附加到 basePath
之后,/api/v1
。
controllers
控制器类文件的存放目录。
4-3 控制器
正如上面配置,我们把控制器类文件都存放到目录 backend/src/controllers
下。我们创建一个控制器类文件:Test.ts
// file: backend/src/controllers/Test.ts
class TestController {}
类名以及类文件名称都采用大驼峰命名,以及类名后
Controller
这个只是一个自己定义的规范,并非强制要求。
当然仅仅只是这么一个类是没有什么作用的,我们还需要把这个类变成控制类,并绑定其中的类方法到指定的路由中,这就需要用到 装饰器
。
4-4 装饰器
Controller 装饰器
语法:@Controller(basePath?)
针对类的装饰器,被装饰的类就会成为一个控制器类,只有控制器类下的方法才能与路由进行绑定。
basePath:与该类中方法绑定的路由的前缀路径。
HTTP请求方法装饰器
目前 koa-ts-controllers
支持如下几个方法装饰器:
- @Get(path)
- @Post(path)
- @Patch(path)
- @Put(path)
- @Delete(path)
这些装饰器使用在类的方法中,接受一个 path
参数,作用是把被装饰的类方法与指定的 HTTP方法
及其 融合后的 path
进行绑定。
代码实例
// file: backend/src/controllers/Test.tsimport {Controller, Get} from 'koa-ts-controllers';@Controller('/test')
class TestController {@Get('/hello')async sayWorld() {return 'Hello Test!';}}
启动服务以后,通过http://localhost:8080/api/v1/test/hello
这样的路径就可以进行访问了!
出现未找到class-validator
的错误
装一下这个库就行了
npm i class-validator
trello01:后端的搭建相关推荐
- ceph查看卷_基于CEPH后端存储搭建Harbor
上一篇文章基于NFS后端存储搭建Harbor ,这一节来聊聊K8s与CEPH的对接以及基于CEPH Harbor的构建. 因为资源的问题,测试环境仍然是K8s的ALL-IN-ONE环境,CEPH集群通 ...
- 仿联想商城laravel实战---2、后端页面搭建(验证码如何在页面中使用)
仿联想商城laravel实战---2.后端页面搭建(验证码如何在页面中使用) 一.总结 一句话总结: 放在img里面,img的src就是生产验证码的控制器路径: img src="/admi ...
- 电商项目1、后端环境搭建
前后端环境搭建 1.微服务架构图 2.微服务划分图 3.项目前置要求 4.搭建项目 1.码云创建项目 2.idea创建后端项目 1.商品服务: 1.微服务架构图 2.微服务划分图 3.项目前置要求 1 ...
- 十分钟,零基础使用uniCloud完成后端管理系统搭建一
本文主要是通过uniCloud搭建后端管理系统,适合小白开发者.个人开发者,零后端基础,快速.低成本完成后端管理系统搭建. 还未创建uniCloud服务空间的开发者可以查看我的文章:Dcloud开发者 ...
- SpringCloud工程搭建之前后端分离搭建(可选)
六.前后端分离搭建(可选) 完整工程源码:https://gitee.com/forwardxiang/spring-cloud-demo.git 6.1 创建前端工程 6.1.1 导入依赖 由于是纯 ...
- LVS前后端负载搭建
LVS前后端负载搭建 1.介绍 keepalived介绍 keepalived是一款服务器状态检测和故障切换的工具.在其配置文件中,可以配置主备服务器和该服务器的状态检测请求.也就是说keepaliv ...
- 【 .NET Core 3.0 】框架之二 || 后端项目搭建
前言 至于为什么要搭建.Net Core 平台,这个网上的解释以及铺天盖地,想了想,还是感觉重要的一点,跨平台,嗯!没错,而且比.Net 更容易搭建,速度也更快,所有的包均由Nuget提供,不再像以前 ...
- Java Spring 后端项目搭建
参考了几位同行的Blogs和StackOverflow上的许多问答,搭建了此后端项目,替换原来的node.js后端,和前一篇中搭建的Vue Web App项目配合使用,后端准备只提供服务,不包含后端装 ...
- springboot+vue全栈开发_springboot+vue(一)___开发环境以及前后端项目搭建
nodejs安装 安装: nodejs官网地址:https://nodejs.org/en/ 安装node.js,安装路径我默认安装在C盘 ,可以改变路径 安装配置全局安装路径和缓存 现在配置全局模 ...
最新文章
- 实战 | 如何用最快的速度学会Dlib人脸识别开发?
- python 归一化_python 归一化
- java实现登录注册案例_Java基于IO版实现用户登录注册的案例
- 面试的算法1(C语言)(整理)(组合数 字符串倒置 最大公共串)
- 洛谷 P4175: bzoj 1146: [CTSC2008]网络管理
- Java连接SQL Server 2012【查看自己电脑上的SQL Server端口号;附:jar包】
- Django(part34)--一对多映射
- 应用程序部署策略——虚拟机与容器
- JQuer实战第一讲:验证用户名是否可用
- Windows下IIS搭建Ftp服务器
- 华为手机海拔测试软件,华为手机海拔高度测量仪
- Atitit.常见软件 数据 交换格式 标准
- 解决udhcpc命令无法自动获取并设置网卡IP和系统DNS
- VSCode中插件Code Spell Checker
- 【经验教程】google谷歌Gmail邮箱帐号被停用怎么恢复Gmail邮箱google谷歌账号?
- 统一社会信用代码 php验证
- SDN控制器测试专题一:基础知识篇
- 在Windows Server 2008和Vista中增加恢复菜单WinRE
- js统一社会信用代码正则验证
- WD移动硬盘unlock解锁之后看不到盘符的解决办法