发布时间:2025-06-24 19:29:50  作者:北方职教升学中心  阅读量:767


创建项目目录并初始化

  首先,创建一个新的项目文件夹,例如通过命令行操作:

mkdirmy-node-ts-projectcdmy-node-ts-projectnpminit -y

  npm init -y 命令会初始化一个 package.json 文件,用于管理项目的依赖和相关配置信息,-y 参数表示使用默认配置进行初始化。
  例如,创建一个接收用户注册信息的路由,需要处理请求体中的 JSON 数据(假设用户注册信息包含用户名和密码):

importexpress from'express';import{Request,Response }from'express';interfaceUserRegistration{username:string;password:string;}constrouter =express.Router();router.post('/register',(req:Request<{},{},UserRegistration>,res:Response)=>{constuserData:UserRegistration =req.body;console.log(`Received registration data: ${JSON.stringify(userData)}`);// 这里可以进行后续的业务逻辑,比如将用户信息存入数据库等操作res.status(201).send('Registration successful');});exportdefaultrouter;

  在这个示例中,定义了 UserRegistration 接口来描述用户注册信息的结构(包含用户名和密码两个属性,类型都为 string),在路由处理函数的 Request 类型参数中,通过泛型指定了请求体的类型为 UserRegistration,这样在函数内部就能安全地从 req.body 获取并使用用户注册信息了,编译器会确保类型的一致性。安装必要的依赖包

  对于一个基于 TypeScript 和 Node.js 的后端项目,需要安装以下核心依赖:

  • typescript:TypeScript 编译器,用于将 TypeScript 代码编译为 JavaScript 代码。数据库交互
    • (一)使用 Type - Safe 的数据库驱动(如 TypeORM)
      • 1、编写服务器代码

        (一)定义路由类型(使用 Express 等框架)

          以 Express 框架为例,在 TypeScript 中定义路由时,可以先创建一个路由模块,然后明确路由处理函数的类型。数据库操作的类型安全实现(增删改查)

          基于上述定义的实体类,可以进行各种数据库操作,并且在操作过程中保持类型安全。用户名、

        2、

        文章目录

        • 一、
          对于插入数据(新增用户)操作,示例如下:

          import{getConnection }from'typeorm';importUser from'./entities/User';asyncfunctioncreateUser(newUser:User){constconnection =awaitgetConnection();constuserRepository =connection.getRepository(User);returnawaituserRepository.save(newUser);}// 使用示例(async()=>{constnewUser:User ={username:'new_user',password:'new_password'};constcreatedUser =awaitcreateUser(newUser);console.log(createdUser);})();

            在插入操作中,定义了 createUser 函数接收一个 User 类型的参数 newUser,然后将其保存到数据库中,返回的 createdUser 同样是 User 类型,确保了新增数据的类型一致性,整个数据库的增删改查操作在 TypeORM 的帮助下都能很好地遵循 TypeScript 的类型规范,减少因类型不匹配等问题导致的错误,提高后端代码的质量和可维护性。搭建 TypeScript + Node.js 项目

          • (一)初始化项目并安装相关依赖
            • 1、
            • sourceMap:生成源映射文件(.map 文件),在调试时能够将编译后的 JavaScript 代码映射回原始的 TypeScript 代码,方便查找问题。
            • @Column() 装饰器用于定义普通列,如 username 和 password 列,分别对应数据库表中的相应字段,类型都为 string。定义数据库模型(实体类)

          使用 TypeORM,需要创建实体类来描述数据库中的表结构以及表与表之间的关系。数据库操作的类型安全实现(增删改查)


在这里插入图片描述

一、database:分别对应数据库的主机地址、创建项目目录并初始化
  • 2、username、请求类型处理
  • 2、响应类型处理
  • 3、
  • 然后使用 express.Router() 创建了一个路由实例 router,并定义了一个 GET 类型的路由 /users/:id,其处理函数接收 Request 和 Response 类型的参数,在函数内部可以通过 req.params 获取路由参数(这里是用户 ID),并根据业务逻辑返回相应的用户信息(这里简单地返回了模拟数据,实际中可能会从数据库查询等操作获取真实数据),最后通过 res.json() 方法将数据以 JSON 格式返回给客户端。

    1、
      例如,创建一个简单的 userRoutes.ts 文件用于定义用户相关的路由:

    importexpress from'express';import{Request,Response }from'express';constrouter =express.Router();// 定义一个获取用户信息的路由router.get('/users/:id',(req:Request,res:Response)=>{constuserId =req.params.id;// 这里可以假设从数据库等地方获取用户信息并返回,暂时模拟返回一个固定信息constuser ={id:userId,name:'John Doe'};res.json(user);});exportdefaultrouter;

    在上述代码中:

    • 首先导入了 express 框架以及 express 中的 Request 和 Response 类型定义,它们分别用于描述 HTTP 请求和响应的相关结构和属性类型。可以通过以下命令安装:
    npminstalltypescript --save-dev

      这里使用 --save-dev 表示将其作为开发依赖安装,因为它主要在开发阶段使用,项目运行时并不直接依赖它。pipe 等)都符合 Response 类型的定义和要求,确保了响应操作的正确性。

  • entities:定义了实体类文件的路径,实体类用于映射数据库中的表结构,TypeORM 会根据这些实体类来进行数据库操作。
  • logging:开启日志记录,方便查看数据库操作的相关情况,比如执行的 SQL 语句等。

    • @types/node:这个包提供了 Node.js 相关的类型定义,使得在 TypeScript 代码中使用 Node.js 的内置模块(如 http、port、

    (二)定义数据库模型和操作的类型(增删改查)

    1、编写服务器代码

    • (一)定义路由类型(使用 Express 等框架)
    • (二)处理请求和响应的类型(包括中间件的类型)
      • 1、
      • outDir:定义编译后 JavaScript 文件的输出目录,这里设置为 dist,意味着编译后的 .js 文件会存放在 dist 文件夹下。密码和数据库名称,根据实际情况进行填写。
      • rootDir:指定 TypeScript 源代码的根目录,通常是 src 文件夹,编译器会从这个目录及其子目录中查找 .ts 文件进行编译。访问用户的各个属性等操作)。端口号、
          例如,在一个返回文件下载的路由中,需要正确设置响应头来指示文件类型等信息:

        importexpress from'express';import{Request,Response }from'express';importpath from'path';importfs from'fs';constrouter =express.Router();router.get('/download/:filename',(req:Request,res:Response)=>{constfileName =req.params.filename;constfilePath =path.join(__dirname,'uploads',fileName);constfileStream =fs.createReadStream(filePath);res.setHeader('Content-Type','application/octet-stream');res.setHeader('Content-Disposition',`attachment; filename="${fileName}"`);fileStream.pipe(res);});exportdefaultrouter;

          在这个示例中,设置了响应头的 Content-Type 和 Content-Disposition 属性,用于告知客户端这是一个文件流下载,并且指定了文件名等信息,整个过程中 res 的各种方法调用(如 setHeader、
        在这里插入图片描述