如何在30分钟内用TypeScript编写REST API:逐步指南
创建REST API是任何后端开发人员的基本任务。使用TypeScript可以增加严格的类型检查,提高代码可读性并减少错误数量。在本文中,我们将从零开始,在短短30分钟内用TypeScript编写一个完整的REST API。您将了解Express、TypeORM以及代码组织的最佳实践。
1. 项目设置和安装依赖
首先创建一个新目录并初始化Node.js项目:
mkdir my-rest-apicd my-rest-apinpm init -y安装必要的包:
npm install express reflect-metadata typeorm sqlite3npm install -D typescript @types/node @types/express ts-node nodemon创建TypeScript配置文件tsconfig.json:
{ "compilerOptions": { "target": "ES2020", "module": "commonjs", "outDir": "./dist", "rootDir": "./src", "strict": true, "esModuleInterop": true, "experimentalDecorators": true, "emitDecoratorMetadata": true, "skipLibCheck": true }, "include": ["src/**/*"]}2. 创建基本结构和入口点
按以下方式组织文件夹结构:
src/— 主要代码src/controllers/— 控制器src/entities/— 数据库实体src/routes/— 路由
创建文件src/index.ts作为应用程序入口点:
import "reflect-metadata";import express from "express";import { AppDataSource } from "./data-source";import { userRoutes } from "./routes/userRoutes";
const app = express();const PORT = process.env.PORT || 3000;
app.use(express.json());
AppDataSource.initialize() .then(() => { console.log("Database connected"); app.use("/api/users", userRoutes); app.listen(PORT, () => { console.log(`Server running on http://localhost:${PORT}`); }); }) .catch((error) => console.log(error));现在创建src/data-source.ts用于TypeORM配置:
import { DataSource } from "typeorm";import { User } from "./entities/User";
export const AppDataSource = new DataSource({ type: "sqlite", database: "database.sqlite", synchronize: true, logging: false, entities: [User],});3. 定义实体和控制器
创建文件src/entities/User.ts作为用户模型:
import { Entity, PrimaryGeneratedColumn, Column } from "typeorm";
@Entity()export class User { @PrimaryGeneratedColumn() id!: number;
@Column() name!: string;
@Column() email!: string;
@Column({ default: true }) isActive!: boolean;}现在创建控制器src/controllers/userController.ts:
import { Request, Response } from "express";import { AppDataSource } from "../data-source";import { User } from "../entities/User";
const userRepository = AppDataSource.getRepository(User);
export const getUsers = async (req: Request, res: Response) => { try { const users = await userRepository.find(); res.json(users); } catch (error) { res.status(500).json({ message: "Error fetching users" }); }};
export const getUserById = async (req: Request, res: Response) => { try { const user = await userRepository.findOneBy({ id: parseInt(req.params.id) }); if (!user) { return res.status(404).json({ message: "User not found" }); } res.json(user); } catch (error) { res.status(500).json({ message: "Error fetching user" }); }};
export const createUser = async (req: Request, res: Response) => {