Ts.ED 是一个 Node.js 框架,用于通过简单的设置构建可扩展的服务器端应用程序。Ts.ED使用 TypeScript 开发,允许您使用面向对象编程、函数式编程或装饰器构建应用程序。您可以在完整的开箱即用项目之间进行选择,也可以自己自定义项目。
在本文中,我们将通过构建一个简单的博客文章数据库来学习如何使用 Ts.ED 和 MySQL 构建服务器端应用程序。要学习本教程,您需要在计算机上安装以下内容:
-
Node.js v14.x
-
MySQL数据库
-
邮差
Ts.ED 的开发人员提供了丰富的文档来帮助您快速设置。我绝对建议在开始学习本教程之前先检查一下。此外,本教程的完整代码可在 Git Hub上找到。随意克隆它以跟随。让我们开始吧!
目录
-
Ts.ED 的好处
-
搭建新项目
-
更新数据源
-
创建实体模型
-
配置 Multer
-
创建应用服务
-
创建应用控制器
-
提供静态文件
-
测试应用程序
Ts.ED 的好处
在开始编码之前,让我们考虑一下为什么 Ts.ED 是 Web 开发人员的出色 Node.js 框架的一些原因。一方面,它允许您使用 OpenSpec 和 JSON Schema 投诉更快地创建 REST API。丰富的 CLI 工具允许您创建预配置的服务器,从而节省一些时间,并且它有许多插件可供您选择来创建您的堆栈。
Ts.ED 是一个基于类的框架,因此,控制器、管道和中间件被创建为一个类。最后,它具有一些嵌入式功能,可以更轻松地测试您的应用程序。醉拳影视(zuiquan.tv),双端看片神器无VIP限制,全部都是1080P超清画质!随着我们学习本教程,我们将看到这些功能的实际应用。让我们开始吧!
搭建新项目
要设置我们的新项目,我们首先需要使用以下命令安装Ts.ED CLI:
npm install -g @tsed/cli
安装完成后,创建一个文件夹并使用以下命令初始化一个新项目:
mkdir tsed-demo && cd tsed-demo tsed init .
上面的命令将创建一个名为tsed-demo. 该tsed init .命令将提示您选择所需的配置。选择以下内容:
-
目标平台:快递
-
项目架构:Ts.ED
-
约定文件样式:选择Ts.ED
-
您的项目所需的功能:数据库
-
数据库的 ORM:TypeORM
-
要安装的 TypeORM:MySQL
-
包管理器:纱线
Ts.ED 会在文件夹的根目录下新建一个项目,.在 init 命令中用 表示。等待 Yarn 安装运行应用程序所需的包;安装完成后,Ts.ED 将创建以下文件夹结构:
tsed-demo ┣ node_modules ┣ src ┃ ┣ config ┃ ┃ ┣ envs ┃ ┃ ┃ ┗ index.ts ┃ ┃ ┣ logger ┃ ┃ ┃ ┗ index.ts ┃ ┃ ┗ index.ts ┃ ┣ controllers ┃ ┃ ┗ rest ┃ ┃ ┃ ┣ HelloWorldController.ts ┃ ┃ ┃ ┗ index.ts ┃ ┣ datasources ┃ ┃ ┗ MysqlDatasource.ts ┃ ┣ Server.ts ┃ ┗ index.ts ┣ .DS_Store ┣ .barrelsby.json ┣ .dockerignore ┣ .gitignore ┣ Dockerfile ┣ README.md ┣ docker-compose.yml ┣ package.json ┣ processes.config.js ┣ tsconfig.compile.json ┣ tsconfig.json ┗ yarn.lock
让我们回顾一下最重要的文件:
-
Server.ts:主服务器配置文件,其中配置了运行应用程序所需的所有配置
-
index.ts:引导应用程序的根文件
-
src/config: 每个 Ts.ED 项目的配置文件夹
-
src/datasource: 所选数据库管理系统的配置
-
src/controllers/rest:控制器文件夹。默认情况下,Ts.ED 监听/rest端点以访问控制器中的路由
更新数据源
创建项目后,让我们创建并连接到我们的数据库。使用以下命令打开 MySQL shell:
mysql -u root -p
然后,使用以下命令创建一个博客数据库:
CREATE DATABASE blog;
现在,打开src/datasources/MysqlDatasource.ts文件并使用以下代码片段更新数据源:
... export const MysqlDataSource = new DataSource({ type: "mysql", entities: [], host: "localhost", port: 3306, username: "YOUR DATABASE USERNAME", password: "YOUR DATABASE USERNAME", database: "blog", synchronize: true, }); ...
在上面的配置中,我们将数据源的值修改为我们数据库的值。我们包括synchronize: true允许 Ts.ED 为我们的数据库生成表。
创建实体模型
让我们为我们的博客数据库创建一个实体模型。我们可以使用以下命令轻松做到这一点:
tsed generate
从提供者列表中选择model。该命令应models/BlogService.ts在文件夹中生成一个文件src。接下来,使用以下代码片段创建模型:
import {Property} from "@tsed/schema"; import {Column, Entity, PrimaryGeneratedColumn, CreateDateColumn, UpdateDateColumn} from "typeorm"; @Entity() export class BlogModel { @Property() @PrimaryGeneratedColumn() id: string; @Column() title: string; @Column() content: string; @Column() coverImage: string; @Column() @CreateDateColumn() createdAt: Date; @Column() @UpdateDateColumn() updatedAt: Date; }
为了创建一个实体,我们导入了Entity和Column装饰器。PrimaryGeneratedColumn将为实体生成主键,CreateDateColumn并将UpdateDateColumn创建、自动生成、日期和更新日期。
接下来,您需要使数据源中的数组BlogModel可用:entities
export const MysqlDataSource = new DataSource({ ... entities: [BlogModel], ... });
配置 Multer
现在,让我们配置 Multer 以允许用户上传保存在数据库中的每个博客的封面图片。Ts.ED 已经有此设置的配置。只需转到该Server.ts文件并将 Multer 附加到具有以下代码片段的配置中:
... import { diskStorage } from "multer"; ... @Configuration({ ... multer: { storage: diskStorage({ destination: join(process.cwd(), "./public/uploads"), filename: (req, file, cb) => { const ext = file.mimetype.split('/')[1]; cb(null, `${generateName(15)}-${Date.now()}.${ext}`); } }) }, ...
有多种使用 Multer 上传文件的方法。对于此演示,我们将文件存储在磁盘存储中。我们diskStorage从 Multer 导入,Ts.ED 在项目设置期间为我们自动安装了它。
然后,我们在文件系统中指定文件将存储在服务器中的位置,并通过创建generateName函数修改文件的文件名。该generateName函数将为每个上传的文件生成 15 个随机字符串字符,并将文件上传的日期附加到文件名中。
现在,generateName使用下面的代码片段创建函数:
function generateName(length: number) { let str = ''; const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; const charactersLength = characters.length; for (let i = 0; i < length; i++) { str += characters.charAt(Math.floor(Math.random() * charactersLength)); } return str; }
您可以在Ts.ED 文档中查看其他 Multer 选项。
创建应用服务
创建模型实体后,让我们使用以下生成命令生成服务:
tsed generate service
然后,命名服务博客并按回车键。Ts.ED 将创建另一个名为文件services的BlogService.ts文件夹。现在,使用以下代码片段更新文件:
import { Injectable } from "@tsed/di"; import { Inject } from "@tsed/di"; import { MYSQL_DATA_SOURCE } from "../datasources/MySqlDataSource"; import { DataSource } from "typeorm"; import { BlogModel } from "../models/BlogModel"; @Injectable() export class BlogService { constructor(@Inject(MYSQL_DATA_SOURCE) private dataSource: DataSource) { } async getAll(): Promise<BlogModel[]> { return await this.dataSource.getRepository(BlogModel).find(); } async create(blog: BlogModel): Promise<BlogModel> { return await this.dataSource.getRepository(BlogModel).save(blog); } async getById(id: string): Promise<any> { return await this.dataSource.getTreeRepository(BlogModel).findOne({ where: { id } }); } async update(id: string, blog: BlogModel): Promise<any> { return await this.dataSource.getRepository(BlogModel).update(id, blog); } async delete(id: string): Promise<any> { return await this.dataSource.getRepository(BlogModel).delete(id); } }
在上面的代码片段中,我们使用Inject装饰器将数据源注入到构造函数中。在那里,我们从类中创建了一个实例变量DataSource,提供对getRepository方法的访问,然后提供我们在数据库上执行 CRUD 操作所需的方法。
创建应用控制器
现在,我们需要我们的 API 路由来使用我们为此应用程序创建的 CRUD 服务。为此,我们需要使用以下命令生成一个控制器:
tsed generate controller
命名控制器blog,选择rest作为首选控制器,选择作为/blog根端点,然后按回车按钮。Ts.ED 将BlogService在控制器的文件夹中创建一个文件。
BlogService接下来,使用下面的代码片段创建控制器:
import { Controller, Inject } from "@tsed/di"; import { Get, Post, Put, Delete } from "@tsed/schema"; import { BlogService } from "src/services/BlogService"; import { BlogModel } from "src/models/BlogModel"; import { BodyParams, PathParams } from "@tsed/platform-params"; import { MultipartFile, PlatformMulterFile } from "@tsed/common"; @Controller("/blog") export class BlogController { constructor(@Inject(BlogService) private blogService: BlogService) { } @Get("/") get(): Promise<BlogModel[]> { return this.blogService.getAll(); } @Post("/") create(@MultipartFile("file") file: PlatformMulterFile, @BodyParams() blog: BlogModel): Promise<BlogModel> { blog.blogImage = file.filename; return this.blogService.create(blog); } @Get("/:id") getOne(@PathParams("id") id: string): Promise<BlogModel> { return this.blogService.getById(id); } @Put("/:id") update(@PathParams("id") id: string, @BodyParams() blog: BlogModel): Promise<BlogModel> { return this.blogService.update(id, blog); } @Delete("/:id") delete(@PathParams("id") id: string): Promise<BlogModel> { return this.blogService.delete(id); } }
在上面的代码片段中,我们BlogService在构造函数中注入了类,BlogController并为该类创建了一个私有实例,从而可以访问BlogService.
GET然后,我们使用、POST、PUT和DELETE装饰器为应用程序定义了 CRUD 路由。Ts.ED 为我们提供了另外两个装饰器,PathParams和BodyParams. 这两个装饰器使我们能够从请求正文和请求参数中解析数据。
然后,为了使用 Multer 上传文件,我们导入了Ts.ED 提供的MultipartFile和装饰器。PlatformMulterFile
超过 20 万开发人员使用 LogRocket 来创造更好的数字体验了解更多 →
提供静态文件
为了在我们的应用程序中提供封面图像和文件,我们需要将应用程序配置为提供静态文件。我们还将Server.ts使用以下代码片段在文件中执行此操作:
... @Configuration({ ... statics: { "/static": [ { root: `./public`, // Optional hook: "$beforeRoutesInit" // Load statics on the expected hook. Default: $afterRoutesInit // ... statics options } ] } ...
Ts.ED 使用statics对象来配置静态文件。此对象将 URL 路径作为必需参数。因此,我们从/static路由访问静态文件。URL 路径也将数组作为键值对。在这个数组中,我们指定了静态文件的位置。对于此演示,我们希望它们位于我们将很快创建的公用文件夹中。
public现在,在项目的根目录中创建一个文件夹。您可以在文档中找到更多静态选项。
测试应用程序
现在,让我们使用 Postman 测试我们的应用程序。在此之前,使用以下命令启动服务器:
yarn start
上面的命令将在 port 上启动服务器8083,这是为 Ts.ED 项目配置的默认端口。接下来,打开 Postman 并测试创建路由,如下截图所示:
如果你打开publicanduploads文件夹,你应该会看到上传的封面图片:
然后,测试get-all获取所有博客的路由,如下图:
随意测试其他路线。
结论
在本教程中,我们通过构建一个简单的博客数据库应用程序来探索 Ts.ED。Ts.ED 是一个现代 Node.js 框架,用于创建可扩展的服务器端应用程序。
使用 Ts.ED,您可以轻松快速地开发服务器端应用程序。您可以构建和管理小型应用程序,例如网站和博客,而无需进行任何初始服务器配置。随意从官方文档中阅读更多关于 Ts.ED 的信息。快乐编码!