如何使用 Fastify 和 TypeScript 构建 Node.js 应用程序

在前端领域,我们经常会使用 TypeScript 来开发我们的应用程序,这样可以提高代码的可读性和可维护性。在 Node.js 开发中,我们同样可以使用 TypeScript 来构建我们的应用程序,并且结合使用 Fastify 这个快速的 Web 框架来提高应用程序的性能和稳定性。

本篇文章将介绍如何使用 Fastify 和 TypeScript 来构建 Node.js 应用程序,包括如何安装和配置使用 Fastify 和 TypeScript,以及如何创建路由和控制器来处理 HTTP 请求,并且在最后提供完整的示例代码。

安装和配置 Fastify 和 TypeScript

首先,我们需要安装 Node.js 和 npm。可以在 Node.js 官网 下载安装。

接下来,我们可以使用 npm 来安装 Fastify 和 TypeScript:

安装完成后,我们需要在项目根目录下创建一个 tsconfig.json 文件来配置 TypeScript 的编译选项,示例文件内容如下:

{
  "compilerOptions": {
    "target": "es6",
    "module": "commonjs",
    "declaration": true,
    "outDir": "./dist",
    "strict": true,
    "esModuleInterop": true
  },
  "exclude": ["node_modules"]
}

这个文件的作用在于告诉 TypeScript 编译器如何编译我们的 TypeScript 代码,并且将编译结果存放到 dist 目录下。同时,我们还需要在 package.json 文件中添加以下脚本:

"scripts": {
  "build": "tsc"
}

这样,当我们运行 npm run build 命令时,TypeScript 将会根据 tsconfig.json 文件中的配置来编译我们的 TypeScript 代码。

创建路由和控制器

首先,我们需要在 src 目录下创建一个 app.ts 文件,并且在其中添加以下代码:

import fastify from 'fastify'

const app = fastify()

app.get('/', async (req, res) => {
  return { hello: 'world' }
})

app.listen(3000, (err) => {
  if (err) throw err
  console.log(`Server listening on port 3000`)
})

这个文件主要是创建了一个 Fastify 应用实例,并且添加了一个简单的路由来处理 / 路径的 HTTP GET 请求,返回一个 JSON 对象 { hello: 'world' }

接下来,我们需要创建一个控制器来处理 HTTP 请求,并且将其绑定到路由上。在 src/controllers 目录下创建一个 index.ts 文件,代码如下:

import { FastifyRequest, FastifyReply } from 'fastify'

export const helloWorld = async (req: FastifyRequest, res: FastifyReply) => {
  return res.send({ hello: 'world' })
}

这个文件主要是定义了一个 helloWorld 函数,用于处理 HTTP 请求,并且返回一个 JSON 对象 { hello: 'world' }

接下来,我们需要在 src/routes 目录下创建一个 index.ts 文件来定义路由,并且将控制器绑定到路由上。示例代码如下:

import { helloWorld } from '../controllers'

export default async function (app: FastifyInstance) => {
  app.get('/', helloWorld)
}

这个文件主要是定义了一个 / 路径的 GET 请求,并且将 helloWorld 函数绑定到这个路由上。

添加中间件

接下来,我们可以添加一些中间件来处理 HTTP 请求。在 src/middlewares 目录下创建一个 logger.ts 文件,代码如下:

import { FastifyRequest, FastifyReply } from 'fastify'

export const logger = async (req: FastifyRequest, res: FastifyReply, done: () => void) => {
  console.log(`${req.method} ${req.url}`)
  done()
}

这个文件主要是定义了一个 logger 中间件函数,用于在控制台中打印 HTTP 请求的方法和路径。

接下来,在 src/app.ts 文件中添加以下代码来使用这个中间件:

import fastify from 'fastify'
import loggerMiddleware from './middlewares/logger'
import routes from './routes'

const app = fastify()

app.register(loggerMiddleware)

routes(app)

app.listen(3000, (err) => {
  if (err) throw err
  console.log(`Server listening on port 3000`)
})

这个文件主要是在 Fastify 应用实例中注册了 loggerMiddleware 中间件,并且加载了路由。

示例代码

最后,我们提供一个完整的示例代码,供读者参考。

import fastify, { FastifyInstance } from 'fastify'
import loggerMiddleware from './middlewares/logger'
import routes from './routes'

const app: FastifyInstance = fastify()

app.register(loggerMiddleware)

routes(app)

app.listen(3000, (err) => {
  if (err) throw err
  console.log(`Server listening on port 3000`)
})
// src/routes/index.ts
import { helloWorld } from '../controllers'

export default async function (app: FastifyInstance) => {
  app.get('/', helloWorld)
}
// src/controllers/index.ts
import { FastifyRequest, FastifyReply } from 'fastify'

export const helloWorld = async (req: FastifyRequest, res: FastifyReply) => {
  return res.send({ hello: 'world' })
}
// src/middlewares/logger.ts
import { FastifyRequest, FastifyReply } from 'fastify'

export const logger = async (req: FastifyRequest, res: FastifyReply, done: () => void) => {
  console.log(`${req.method} ${req.url}`)
  done()
}
// tsconfig.json
{
  "compilerOptions": {
    "target": "es6",
    "module": "commonjs",
    "declaration": true,
    "outDir": "./dist",
    "strict": true,
    "esModuleInterop": true
  },
  "exclude": ["node_modules"]
}
// package.json
{
  "name": "fastify-typescript-app",
  "version": "1.0.0",
  "description": "A simple Node.js application built with Fastify and TypeScript.",
  "main": "dist/app.js",
  "scripts": {
    "build": "tsc"
  },
  "author": "Your Name",
  "license": "MIT",
  "dependencies": {
    "fastify": "^3.18.0",
    "typescript": "^4.4.4"
  },
  "devDependencies": {
    "@types/fastify": "^3.1.6",
    "@types/node": "^16.9.6"
  }
}

总结:通过本文的介绍,读者可以了解到如何使用 Fastify 和 TypeScript 来构建 Node.js 应用程序。同时,本文还提供了详细的示例代码,方便读者学习和参考。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65b0c2e9add4f0e0ffa1be61