构建现代化且可用于生产环境的Node.js API:我的基础配置

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

作为一名API-first产品的忠实开发者,我在构建和部署API方面积累了丰富的经验。在这篇文章中,我将分享我的基础配置和工具选择,这些工具帮助我快速、高效地构建现代化且可用于生产环境的Node.js API。这些技术和工具的组合既包含了稳定可靠的“传统”技术(如Express.js和PM2),也融入了新兴的现代化工具(如GPT)。


编程语言与运行时环境

编程语言:JavaScript

JavaScript是构建API的核心语言,其灵活性和强大的生态系统使其成为开发者的首选。

运行时环境:Node.js

Node.js是后端运行JavaScript的主流环境。我通常使用Node.js的v16和v18版本,这些版本在性能和兼容性方面表现稳定。


2023年常用的NPM包

在启动Node.js API项目时,我会使用以下命令初始化项目并安装必要的依赖:

npm init -y
npm i express dotenv express-async-handler mocha

随后,我会编辑package.json文件,添加以下配置以支持ES模块:

{
  "name": "starter",
  "version": "1.0.0",
  "description": "",
  "type": "module",
  "main": "index.js",
  "scripts": {
    "dev": "PORT=4005 node src/server.js",
    "test": "mocha --recursive 'tests/**/*.js' --timeout 15000"
  },
  "dependencies": {
    "express": "^4.18.2",
    "dotenv": "^16.0.3",
    "express-async-handler": "^1.2.0"
  },
  "devDependencies": {
    "mocha": "^10.2.0"
  }
}

Express.js与异步处理

虽然Express.js并非最新的框架,但它依然是2023年构建API的可靠选择。为了更好地支持async/await,我使用了express-async-handler包。以下是一个示例代码片段:

import dotenv from "dotenv";
import express from "express";
import asyncHandler from "express-async-handler";

dotenv.config();const app = express();app.get(
  "/process",
  asyncHandler(async (req, res) => {
    const url = req.query.url;
    const json = await method1(url);
    res.json(json);
  })
);// 自定义错误处理中间件
app.use((err, req, res, next) => {
  console.error(err); // 记录错误
  res.status(503).json({ error: 发生错误:${err.message} });
});app.listen(process.env.PORT, () => {
  console.log(服务器在端口 ${process.env.PORT} 上启动);
});

使用express-async-handler可以避免在每个端点中编写冗长的try-catch块,同时确保未处理的异常不会导致请求挂起。


环境变量管理:dotenv

dotenv是一个管理环境变量的流行工具。通过在项目根目录创建.env文件,我可以将敏感信息(如API密钥)与代码分离。以下是一个典型的使用方式:

import dotenv from "dotenv";
dotenv.config();

const apiKey = process.env.API_KEY;

需要注意的是,必须在其他模块加载之前初始化dotenv,否则可能导致环境变量无法正确加载。


API测试工具:REST Client扩展

为了测试API,我更倾向于使用VS Code的REST Client扩展,而不是Postman或cURL。它允许我在VS Code中直接发送请求并查看响应。例如:

@host=http://127.0.0.1:3012

GET {{host}}/news?from=2023-04-10&limit=1

REST Client的优势在于所有API请求都可以保存在文件中,方便管理和快速调用。此外,它还支持一键生成cURL命令,进一步提升了开发效率


进程管理:PM2

在管理Node.js守护进程时,我更倾向于使用PM2。它简单易用,并支持两种运行方式:直接启动脚本或使用生态系统文件。以下是一个典型的ecosystem.config.cjs文件:

module.exports = {
  apps: [
    {
      name: "news-agg-server",
      script: "./src/server.js",
    },
    {
      name: "news-agg-scheduler",
      script: "./src/scheduler.js",
    },
  ],
};

通过pm2 restart ecosystem.config.cjs,我可以轻松重启所有相关进程,而无需记住具体的脚本路径。


OpenAPI规范生成:GPT

对于生成OpenAPI规范。这种方法不仅高效,还能减少手动编写YAML文件的工作量。通过VS Code的Genie GPT扩展,我可以直接在编辑器中完成这一操作。


测试框架:Mocha与GPT

我使用Mocha编写测试,同时借助GPT生成测试样板代码。虽然GPT在处理复杂逻辑时可能存在限制,但对于简单函数,它能够显著提高开发效率。以下是一个示例测试:

import { expect } from "chai";
import { method1 } from "../src/lib.js";

describe("method1", () => {
  it("should return expected result", async () => {
    const result = await method1("https://example.com");
    expect(result).to.be.an("object");
  });
});

数据库选择:MySQL与ClickHouse

目前,我主要使用MySQL作为数据库管理系统。虽然我尝试过使用JSON文件存储状态,但其可靠性不足。对于需要处理大量时间序列数据的场景,我推荐使用ClickHouse,它既适合小型项目,也能扩展到大型团队使用。


开发习惯与项目结构

保持一致的项目结构和开发习惯能够显著提升效率。以下是我常用的项目目录结构:

/src/server.js
/src/lib.js
.env
ecosystem.config.cjs
api.http
openapi.yaml
package.json
README.md

通过这种结构,我可以快速启动开发服务器并测试API。


通过上述工具和配置,我能够快速构建现代化且可用于生产环境的Node.js API。这些技术和工具的组合不仅提高了开发效率,还确保了项目的稳定性和可维护性。

原文链接: https://pixeljets.com/blog/building-modern-express-js-api/