Express Typescript 使用 TypeScript 开发 Express 应用程序 nodemon 安装 使用

2025-06-09

Express Typescript使用 TypeScript 开发 Express 应用程序

nodemon

安装

用法

这篇文章最初发表在我的博客上

最近我在研究 TypeScript。我问了一个关于 TypeScript 的问题。开发者们帮助了我。

在这篇文章中,我将向您展示如何使用 TypeScript 创建一个快速应用程序。

在你开始之前,我对我的语法错误感到非常抱歉。

Express 框架

如您所知,Express 是一个在服务器上运行的 NodeJS Web 框架。

依赖项的安装

npm i express pug ts-node typescript @types/express @types/node
Enter fullscreen mode Exit fullscreen mode

这些是依赖项。

编辑 package.json 和 tsconfig.json 文件

package.json 中的脚本部分将会像这样;

"scripts": {
    "dev": "ts-node src/server.ts",
    "start": "ts-node dist/server.js",
    "build": "tsc -p ."
}
Enter fullscreen mode Exit fullscreen mode

我将能够使用该npm run dev命令运行该应用程序的开发版本。

我的 tsconfig.json 文件将会是这样的;

{
    "compilerOptions": {
        "sourceMap": true,
        "target": "es6",
        "module": "commonjs",
        "outDir": "./dist",
        "baseUrl": "./src"
    },
    "include": [
        "src/**/*.ts"
    ],
    "exclude": [
        "node_modules"
    ]
}
Enter fullscreen mode Exit fullscreen mode

项目结构

这是我们的项目结构;

- dist
- node_modules
- public
- src
- views
package.json
tsconfig.json
Enter fullscreen mode Exit fullscreen mode

顺便说一句,如果您的项目不需要 UI(例如 API 后端),则 public 和 views 文件夹不是必需的。项目将在 src 文件夹下开发。

- controllers
- interfaces
- middleware
app.ts
server.ts
Enter fullscreen mode Exit fullscreen mode

controllers 文件夹包含路由控制器及其接口文件。interfaces 文件夹包含接口文件。middleware 文件夹包含我们的中间件。

让我们看看 app.ts 和 server.ts 文件

应用程序文件 src/(app.ts)

我的申请文件是这样的;

import * as express from 'express'
import { Application } from 'express'

class App {
    public app: Application
    public port: number

    constructor(appInit: { port: number; middleWares: any; controllers: any; }) {
        this.app = express()
        this.port = appInit.port

        this.middlewares(appInit.middleWares)
        this.routes(appInit.controllers)
        this.assets()
        this.template()
    }

    private middlewares(middleWares: { forEach: (arg0: (middleWare: any) => void) => void; }) {
        middleWares.forEach(middleWare => {
            this.app.use(middleWare)
        })
    }

    private routes(controllers: { forEach: (arg0: (controller: any) => void) => void; }) {
        controllers.forEach(controller => {
            this.app.use('/', controller.router)
        })
    }

    private assets() {
        this.app.use(express.static('public'))
        this.app.use(express.static('views'))
    }

    private template() {
        this.app.set('view engine', 'pug')
    }

    public listen() {
        this.app.listen(this.port, () => {
            console.log(`App listening on the http://localhost:${this.port}`)
        })
    }
}

export default App
Enter fullscreen mode Exit fullscreen mode

如您所见,构造函数需要三个参数。按照这个逻辑,端口和控制器参数应该是必需的,但我对此不太确定。我还初始化了资源和模板,以便您在项目中使用 UI。

服务器文件 src/(server.ts)

我的服务器文件是这样的;

import App from './app'

import * as bodyParser from 'body-parser'
import loggerMiddleware from './middleware/logger'

import PostsController from './controllers/posts/posts.controller'
import HomeController from './controllers/home/home.controller'

const app = new App({
    port: 5000,
    controllers: [
        new HomeController(),
        new PostsController()
    ],
    middleWares: [
        bodyParser.json(),
        bodyParser.urlencoded({ extended: true }),
        loggerMiddleware
    ]
})

app.listen()
Enter fullscreen mode Exit fullscreen mode

在这个文件中,我们导入了 App 类。我们传递了三个参数。第一个是端口号。我们的应用将在端口 5000 上运行。

第二个是 controllers 参数。我们的控制器类将在这里使用 new 关键字。

最后一个是 middleWares。如果你正在使用 bodyParser 或者类似的插件,那么可以使用 middleWares。

我们的简单中间件(middleware/logger.ts)

import { Request, Response } from 'express'

const loggerMiddleware = (req: Request, resp: Response, next) => {

    console.log('Request logged:', req.method, req.path)
    next()
}

export default loggerMiddleware
Enter fullscreen mode Exit fullscreen mode

这是一个简单的 HTTP 记录器。它显示 HTTP 动词及其路径。

IControlerBase(接口/IControllerBase.interface.ts)

我认为每个控制器都必须实现这个接口。

interface IControllerBase {
    initRoutes(): any
}

export default IControllerBase
Enter fullscreen mode Exit fullscreen mode

我们的第一个控制器(controllers/home.controller.ts)

HomeController 将会是这样的;

import * as express from 'express'
import { Request, Response } from 'express'
import IControllerBase from 'interfaces/IControllerBase.interface'

class HomeController implements IControllerBase {
    public path = '/'
    public router = express.Router()

    constructor() {
        this.initRoutes()
    }

    public initRoutes() {
        this.router.get('/', this.index)
    }

    index = (req: Request, res: Response) => {

        const users = [
            {
                id: 1,
                name: 'Ali'
            },
            {
                id: 2,
                name: 'Can'
            },
            {
                id: 3,
                name: 'Ahmet'
            }
        ]

        res.render('home/index', { users })
    }
}

export default HomeController
Enter fullscreen mode Exit fullscreen mode

我们已经实现了 IControllerBase。因此,我们必须遵循它的规则。在这个示例控制器文件中,我们假设数据来自数据库服务器。我将这些数据发送到(home/index.pug)文件。该文件位于 views 文件夹下。

<!DOCTYPE html>
html(lang="en")
    head
        meta(charset="UTF-8")
        meta(name="viewport", content="width=device-width, initial-scale=1.0")
        meta(http-equiv="X-UA-Compatible", content="ie=edge")
        title Document
    body
        each user, index in users
            h2(onclick=`alert(${index})`)= user.name
Enter fullscreen mode Exit fullscreen mode

这是我们的 pug 文件。我们也实现了这个initRoutes方法。因为 boss(IControllerBase)需要它。

让我们启动应用程序

npm run dev
Enter fullscreen mode Exit fullscreen mode

使用此命令,我们将能够运行我们的应用程序。我们的应用程序可以在 上运行http://localhost:5000

使用 TypeScript 开发 Express 应用程序

您还可以检查 posts 文件夹。在此项目中,您可以使用 TypeORM 或 Sequelize。

您可以在 GitHub 上找到该项目:https://github.com/aligoren/express-typescript-test

结论

我非常喜欢使用 TypeScript。在从事这项工作之前,我完全不知道 TypeScript 是如何工作的。

谢谢阅读。

鏂囩珷鏉ユ簮锛�https://dev.to/itachiuchiha/developing-an-express-application-using-typescript-3b1
PREV
使用 IntersectionObserver API 进行延迟加载 GenAI LIVE!| 2025 年 6 月 4 日
NEXT
使用 Markdown 提高你的工作效率。Boost Note for Teams