• 使用 TypeORM 和 Express 的示例
    • 初始设置
    • 将Express添加到应用程序
    • 将TypeORM添加到应用程序

    使用 TypeORM 和 Express 的示例

    初始设置

    让我们创建一个名为”user”的简单应用程序,它将用户存储在数据库中 并允许我们在 web api 创建、更新、删除和获取所有用户的列表,以及通过 id 获取的单个用户。

    首先,创建一个名为”user”的目录:

    1. mkdir user

    然后切换到目录并创建一个新项目:

    1. cd user
    2. npm init

    通过填写所有必需的应用程序信息来完成初始化过程。

    现在我们需要安装和设置 TypeScript 编译器。 首先安装:

    1. npm i typescript --save-dev

    然后创建一个tsconfig.json文件,其中包含应用程序编译和运行所需的配置。 使用你常用的编辑器创建它并进行以下配置:

    1. {
    2. "compilerOptions": {
    3. "lib": ["es5", "es6"],
    4. "target": "es5",
    5. "module": "commonjs",
    6. "moduleResolution": "node",
    7. "emitDecoratorMetadata": true,
    8. "experimentalDecorators": true
    9. }
    10. }

    现在让我们在src目录中创建一个主应用程序入口—app.ts

    1. mkdir src
    2. cd src
    3. touch app.ts

    先在其中添加一个简单的console.log

    1. console.log("Application is up and running");

    然后运行程序。在运行之前,你需要首先编译 typescript 项目:

    1. tsc

    编译之后,可以看到生成一个src/app.js文件。 然后可以使用以下命令运行它

    1. node src/app.js

    运行应用程序后,则在控制台中看到”Application is up and running”的消息。

    每次进行更改时都必须编译文件。 或者,你可以设置监听程序或安装ts-node以避免每次手动编译。

    将Express添加到应用程序

    将 Express 添加到应用程序中。 首先,需要安装依赖包:d:

    1. npm i express body-parser @types/express @types/body-parser --save
    • express 是 express 引擎,允许我们创建一个 web api
    • body-parser 用于设置 express 如何处理客户端发送的 body
    • @types/express 用于在使用 express 时具有类型提示信息
    • @types/body-parser 用于在使用 body parser 时具有类型提示信息

    让我们编辑src/app.ts文件并添加与表达相关的逻辑:

    1. import * as express from "express";
    2. import { Request, Response } from "express";
    3. import * as bodyParser from "body-parser";
    4. //创建并设置 express app
    5. const app = express();
    6. app.use(bodyParser.json());
    7. // 注册路由
    8. app.get("/users", function(req: Request, res: Response) {
    9. // 获取用户信息的逻辑操作
    10. });
    11. app.get("/users/:id", function(req: Request, res: Response) {
    12. // 通过id获得用户信息的逻辑操作
    13. });
    14. app.post("/users", function(req: Request, res: Response) {
    15. // 保存用户信息的逻辑操作
    16. });
    17. app.put("/users/:id", function(req: Request, res: Response) {
    18. // 根据给定id更新某个用户的逻辑操作
    19. });
    20. app.delete("/users/:id", function(req: Request, res: Response) {
    21. // 根据给定id删除一个用户的逻辑操作
    22. });
    23. // 启动 express 服务
    24. app.listen(3000);

    现在你可以编译并运行项目。 此时你应该有一个启动的 express 服务,并且有可以工作的路由。 但是,这些路由目前并未返回任何内容。

    将TypeORM添加到应用程序

    最后,让我们将 TypeORM 添加到应用程序中。 在这个例子中,我们将使用mysql驱动程序。 其他驱动程序的安装过程类似。

    首先安装依赖包:

    1. npm i typeorm mysql reflect-metadata --save
    • typeorm typeorm 包
    • mysql 是底层数据库驱动程序。如果你使用的是其他数据库系统,则必须安装相应的包。
    • reflect-metadata 需要使装饰器正常工作

    然后创建一个ormconfig.json文件来配置数据库连接。

    1. {
    2. "type": "mysql",
    3. "host": "localhost",
    4. "port": 3306,
    5. "username": "test",
    6. "password": "test",
    7. "database": "test",
    8. "entities": ["src/entity/*.js"],
    9. "logging": true
    10. }

    根据需要配置每个选项。 了解有关 连接选项的更多信息。

    让我们在src/entity中创建一个User实体:

    1. import { Entity, Column, PrimaryGeneratedColumn } from "typeorm";
    2. @Entity()
    3. export class User {
    4. @PrimaryGeneratedColumn()
    5. id: number;
    6. @Column()
    7. firstName: string;
    8. @Column()
    9. lastName: string;
    10. }

    然后修改 src/app.ts:

    1. import * as express from "express";
    2. import { Request, Response } from "express";
    3. import * as bodyParser from "body-parser";
    4. import { createConnection } from "typeorm";
    5. import { User } from "./User";
    6. // 创建 typeorm 连接
    7. createConnection().then(connection => {
    8. const userRepository = connection.getRepository(User);
    9. // 创建并设置express app
    10. const app = express();
    11. app.use(bodyParser.json());
    12. // 注册路由
    13. app.get("/users", async function(req: Request, res: Response) {
    14. return userRepository.find();
    15. });
    16. app.get("/users/:id", async function(req: Request, res: Response) {
    17. return userRepository.findOne(req.params.id);
    18. });
    19. app.post("/users", async function(req: Request, res: Response) {
    20. const user = userRepository.create(req.body);
    21. return userRepository.save(user);
    22. });
    23. app.put("/users/:id", function(req: Request, res: Response) {
    24. const user = userRepository.findOne(req.params.id);
    25. userRepository.merge(user, req.body);
    26. return userRepository.save(user);
    27. });
    28. app.delete("/users/:id", async function(req: Request, res: Response) {
    29. return userRepository.remove(req.params.id);
    30. });
    31. // 启动 express server
    32. app.listen(3000);
    33. });

    如果要将逻辑处理提取到单独的文件中并且还需要connection实例,则可以使用getConnection

    1. import { getConnection } from "typeorm";
    2. import { User } from "./User";
    3. export function UsersListAction(req: Request, res: Response) {
    4. return getConnection()
    5. .getRepository(User)
    6. .find();
    7. }

    在这个例子中你甚至不需要getConnection - 可以直接使用getRepository函数:

    1. import { getRepository } from "typeorm";
    2. import { User } from "./User";
    3. export function UsersListAction(req: Request, res: Response) {
    4. return getRepository(User).find();
    5. }