使用Node.js和Express实现安全API的现代方法

作者:API传播员 · 2025-12-13 · 阅读时间:6分钟

TypeScript 的类型安全性和更好的工具结合,可以显著提升代码的长期可维护性和质量。然而,要让所有功能顺利运行并非易事,尤其是在 ESM(ECMAScript 模块)日益普及的背景下。随着越来越多的工具(如 ESM 专用软件包)的出现,开发者可能会遇到模块解析和导入语法冲突等问题。

本文将逐步指导您如何使用 Express 和 TypeScript 构建支持 ESM 的安全现代 Node.js 应用程序,包括启用文件热重载和集成 Arcjet 提升 API 安全性


初始化项目

首先,创建一个新目录并初始化一个新的 Node.js 项目:

mkdir node-express-api
cd node-express-api
npm init -y

这将生成一个具有默认设置的 package.json 文件。


安装依赖项

安装 Express.js 和 TypeScript 相关的软件包:

npm install express
npm install --save-dev typescript ts-node @types/express
  • express:Web 框架。
  • typescriptts-node:提供 TypeScript 支持。
  • @types/express:Express 的 TypeScript 类型定义。

配置 TypeScript

安装完基础依赖项后,需要为项目配置 TypeScript。运行以下命令初始化 TypeScript 配置:

npx tsc --init

这将在项目根目录生成一个 tsconfig.json 文件。更新该文件以确保一切按预期运行:

{
  "compilerOptions": {
    "module": "ESNext",
    "target": "ESNext",
    "moduleResolution": "node",
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    "strict": true,
    "skipLibCheck": true,
    "outDir": "./dist"
  },
  "include": ["src/**/*"]
}

设置 Express API 服务器

接下来,使用 TypeScript 创建一个基本的 Express.js 服务器。首先,创建 src 目录和入口文件:

mkdir src
touch src/app.ts

编辑 src/app.ts 文件,添加以下代码以启动 Express 服务器:

import express from "express";

const app = express();
const port = 3000;app.get("/", (req, res) => {
  res.status(200).json({ message: "Hello World" });
});app.listen(port, () => {
  console.log(应用程序正在监听 http://localhost:${port});
});

此代码设置了一个监听端口 3000 的基本 Express 服务器,并包含一个返回 JSON 格式欢迎消息的路由。


启用热重载

在开发环境中,每次修改代码后自动重启服务器非常有用。可以通过安装 nodemon 实现:

npm install --save-dev nodemon

创建一个 nodemon.json 文件,配置 nodemon 以监视 TypeScript 文件的更改:

{
  "watch": ["src"],
  "ext": "ts",
  "ignore": ["dist"],
  "exec": "node --loader ts-node/esm src/app.ts"
}

package.json 中添加一个脚本以运行 nodemon

"scripts": {
  "dev": "nodemon"
}

此外,为了支持 ESM,需要对 package.json 进行以下更新:

  • 删除 "main": "index.js"
  • 添加 "type": "module"

更新后的 package.json 示例:

{
  "name": "node-express-api",
  "version": "1.0.0",
  "type": "module",
  "scripts": {
    "dev": "nodemon"
  }
}

测试服务器

运行以下命令启动开发服务器:

npm run dev

此时,Express 服务器将启动,并在修改 TypeScript 文件时自动重新加载。


集成 Arcjet 提升安全性

Arcjet 是一个中间件工具,可以通过减轻机器人攻击、滥用和其他网络安全威胁来增强 API 的安全性

首先,安装 Arcjet 的 Node.js 包:

npm install @arcjet/node

配置环境变量(如开发模式和 Arcjet 密钥):

export ARCJET_ENV=development
export ARCJET_KEY=your_arcjet_key

更新 src/app.ts 文件,添加 Arcjet 中间件:

import express from "express";
import Arcjet, { detectBot, shield } from "@arcjet/node";

const app = express();
const port = 3000;const aj = Arcjet({
  key: process.env.ARCJET_KEY!,
  rules: [
    shield({ mode: "LIVE" }),
    detectBot({ mode: "LIVE" })
  ]
});app.use(async (req, res, next) => {
  const decision = await aj.project(req);
  if (decision.isDenied()) {
    if (decision.reason.isRateLimit()) {
      return res.status(429).json({ message: "请求过多" });
    } else {
      return res.status(403).json({ message: "拒绝访问" });
    }
  }
  next();
});app.get("/", (req, res) => {
  res.status(200).json({ message: "Hello World" });
});app.listen(port, () => {
  console.log(应用程序正在监听 http://localhost:${port});
});

更新 nodemon.json 以加载环境变量:

{
  "watch": ["src"],
  "ext": "ts",
  "ignore": ["dist"],
  "exec": "node --env-file .env.local --loader ts-node/esm src/app.ts"
}

生产环境构建

为了将应用程序部署到生产环境,需要设置构建和启动脚本。在 package.json 中添加以下内容:

"scripts": {
  "dev": "nodemon",
  "build": "tsc",
  "start": "node dist/app.js"
}

运行以下命令编译 TypeScript 文件:

npm run build

编译后的 JavaScript 文件将输出到 dist 目录。运行以下命令启动生产服务器:

npm start

总结

通过本文的指导,您已经成功构建了一个现代化的 Node.js API,集成了 TypeScript 和 Arcjet,具备了类型安全性和增强的安全性。TypeScript 的引入提高了代码的可靠性和可维护性,而 Arcjet 则为 API 提供了强大的安全保护。

这种结合不仅让您的 API 更加安全,还为未来的扩展和维护奠定了坚实的基础。

原文链接: https://blog.arcjet.com/a-modern-approach-to-secure-apis-with-node-js-express-typescript-and-esm/