如何使用 Ts.ED 和 MySQL 构建服务器端应用程序

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 的信息。快乐编码!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pxr007

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值