文章目录

  • 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
    基于 KoaTypeScript 构建的路由控制系统,它提供了各种装饰器来构建 RESTful 风格的 API

  • mysql2
    NodeJS 连接操作 MySQL 的库。

  • sequelize
    一个功能更丰富和强大的数据库操作库,支持 MySQLMSSQLSQLite 等数据库,提供了 ORM事务 以及 Promise 等支持。

  • sequelize-typescript
    sequelizeTypeScript

  • class-validator
    基于 validator.jsTypeScript 的数据验证工具,对用户或者接口调用传入的数据进行校验。

  • jsonwebtoken
    JWT 鉴权库。

  • moment
    日期时间处理工具。

1-2 开发工具

这一部分主要是一些辅助工具,比如:Sequelize-cli 等。

  • ts-node-dev
    ts-nodedev 版,实现了热重载(修改代码即可自动重启服务)。

  • 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:后端的搭建相关推荐

  1. ceph查看卷_基于CEPH后端存储搭建Harbor

    上一篇文章基于NFS后端存储搭建Harbor ,这一节来聊聊K8s与CEPH的对接以及基于CEPH Harbor的构建. 因为资源的问题,测试环境仍然是K8s的ALL-IN-ONE环境,CEPH集群通 ...

  2. 仿联想商城laravel实战---2、后端页面搭建(验证码如何在页面中使用)

    仿联想商城laravel实战---2.后端页面搭建(验证码如何在页面中使用) 一.总结 一句话总结: 放在img里面,img的src就是生产验证码的控制器路径: img src="/admi ...

  3. 电商项目1、后端环境搭建

    前后端环境搭建 1.微服务架构图 2.微服务划分图 3.项目前置要求 4.搭建项目 1.码云创建项目 2.idea创建后端项目 1.商品服务: 1.微服务架构图 2.微服务划分图 3.项目前置要求 1 ...

  4. 十分钟,零基础使用uniCloud完成后端管理系统搭建一

    本文主要是通过uniCloud搭建后端管理系统,适合小白开发者.个人开发者,零后端基础,快速.低成本完成后端管理系统搭建. 还未创建uniCloud服务空间的开发者可以查看我的文章:Dcloud开发者 ...

  5. SpringCloud工程搭建之前后端分离搭建(可选)

    六.前后端分离搭建(可选) 完整工程源码:https://gitee.com/forwardxiang/spring-cloud-demo.git 6.1 创建前端工程 6.1.1 导入依赖 由于是纯 ...

  6. LVS前后端负载搭建

    LVS前后端负载搭建 1.介绍 keepalived介绍 keepalived是一款服务器状态检测和故障切换的工具.在其配置文件中,可以配置主备服务器和该服务器的状态检测请求.也就是说keepaliv ...

  7. 【 .NET Core 3.0 】框架之二 || 后端项目搭建

    前言 至于为什么要搭建.Net Core 平台,这个网上的解释以及铺天盖地,想了想,还是感觉重要的一点,跨平台,嗯!没错,而且比.Net 更容易搭建,速度也更快,所有的包均由Nuget提供,不再像以前 ...

  8. Java Spring 后端项目搭建

    参考了几位同行的Blogs和StackOverflow上的许多问答,搭建了此后端项目,替换原来的node.js后端,和前一篇中搭建的Vue Web App项目配合使用,后端准备只提供服务,不包含后端装 ...

  9. springboot+vue全栈开发_springboot+vue(一)___开发环境以及前后端项目搭建

    nodejs安装 安装: nodejs官网地址:https://nodejs.org/en/ 安装node.js,安装路径我默认安装在C盘  ,可以改变路径 安装配置全局安装路径和缓存 现在配置全局模 ...

最新文章

  1. 实战 | 如何用最快的速度学会Dlib人脸识别开发?
  2. python 归一化_python 归一化
  3. java实现登录注册案例_Java基于IO版实现用户登录注册的案例
  4. 面试的算法1(C语言)(整理)(组合数 字符串倒置 最大公共串)
  5. 洛谷 P4175: bzoj 1146: [CTSC2008]网络管理
  6. Java连接SQL Server 2012【查看自己电脑上的SQL Server端口号;附:jar包】
  7. Django(part34)--一对多映射
  8. 应用程序部署策略——虚拟机与容器
  9. JQuer实战第一讲:验证用户名是否可用
  10. Windows下IIS搭建Ftp服务器
  11. 华为手机海拔测试软件,华为手机海拔高度测量仪
  12. Atitit.常见软件 数据 交换格式 标准
  13. 解决udhcpc命令无法自动获取并设置网卡IP和系统DNS
  14. VSCode中插件Code Spell Checker
  15. 【经验教程】google谷歌Gmail邮箱帐号被停用怎么恢复Gmail邮箱google谷歌账号?
  16. 统一社会信用代码 php验证
  17. SDN控制器测试专题一:基础知识篇
  18. 在Windows Server 2008和Vista中增加恢复菜单WinRE
  19. js统一社会信用代码正则验证
  20. WD移动硬盘unlock解锁之后看不到盘符的解决办法

热门文章

  1. 什么是 IP 地址 – 定义和解释
  2. Figma#5:文字
  3. idea maven parent飘红
  4. 51单片机编译没错但proteus数码管仿真出现乱码的情况
  5. python画图y轴在右侧_Python 使用matplotlib画图添加标注、及移动坐标轴位置
  6. 如何在R中画出高效美观的相关性分析图
  7. 怎么把pdf转换成excel
  8. php soap 加符号报错,php soap错误获取http标头
  9. MeteoInfoLab脚本示例:站点填图
  10. 海思Hi3519A 基础入门教程