返回首页
27/02/2024

使用Express.js、Bun和MongoDB构建Web API

摘要

Web API作为现代软件的核心组件,在互联网的广阔景观中无缝连接应用程序。如果您使用Node.js,您可能已经熟悉了MER(A)N技术栈:

  • MongoDB
  • Express
  • React/Angular
  • Node

但自从Bun出现以来,构建高性能API变得不再具有挑战性。因此,本文将重点介绍如何使用Bun支持的MongoDB构建一个Express.js API。

理解工具

如果您对这些工具不熟悉,不用担心,让我们一一深入了解:

  • Express.js:一个与Node.js无缝集成的简洁直接的Web框架,让用户轻松构建API。
  • MongoDB:一个NoSQL数据库,在处理大量数据时表现出色的多功能性。
  • Bun:一个旨在替代Node.js的JavaScript运行时环境。

步骤概述

  1. 安装Bun:首先安装Bun,通过运行安装命令。
  2. 创建Bun项目:初始化Bun项目,并建立项目结构。
  3. 安装库:使用Bun包管理器安装Express.js、MongoDB和Typescript等所需包。
  4. 构建基础服务器:创建一个Express.js服务器,并定义基本路由。
  5. 设计Mongoose模式:在models文件夹中创建模式。
  6. 控制器:为每个路由定义相应的业务逻辑。
  7. 添加路由:创建必要的CRUD路由。
  8. 配置MongoDB:设置数据库连接。
  9. 整合所有组件:将模型、路由和控制器整合到应用中,准备启动。

文章还讨论了如何为Express.js应用添加监控,使用Morgan进行请求日志记录,以及使用express-validator进行数据验证,确保应用接收的数据是干净且结构化的。

通过本文,您将学会如何使用Bun、Express和MongoDB构建应用程序,并引导您将项目提升到生产级别的状态。此外,文章还提供了进一步探索Express.js和MongoDB的官方文档链接,以及其他有用的资源。


主要内容:

步骤1:安装Bun

首先,安装Bun。可以通过运行以下命令来完成:

curl https://bun.sh/install | bash

安装后,通过运行bun --version来验证安装。

步骤2:创建Bun项目

初始化Bun项目:

bun create blog-api

建议的文件夹结构如下:

/blog-api
├── src
│   ├── models
│   ├── controllers
│   ├── routes
│   └── index.ts
├── dist
├── node_modules
├── .bunrc
├── .env
├── package.json
└── tsconfig.json

步骤3:安装库

使用Bun包管理器安装所需的包:

bun install express mongoose
bun install @types/express @types/mongoose typescript bun-types -d

这些命令将安装Express.js、MongoDB的Mongoose以及Typescript。

步骤4:构建基础服务器

src/app.ts中创建Express.js服务器:

import express from 'express';
const app = express();
app.use(express.json());
app.get("/ping", (_, res) => {
    res.send("🏓 pong!");
});
app.listen(3000, () => {
    console.log('The magic happens on port 3000!');
});

这是基本的Express.js应用定义。

步骤5:设计Mongoose模式

src/models文件夹中创建Post.ts

import { Schema, InferSchemaType, model } from 'mongoose';

const postSchema = new Schema({
    title: { type: String, required: true },
    content: { type: String, required: true },
    author: String,
    createdAt: { type: Date, default: Date.now },
});

export type Post = InferSchemaType;
export const Post = model('Post', postSchema);

步骤6:控制器

为每个路由定义业务逻辑。例如,在controllers文件夹中,你可以有postController.ts

import { Request, Response } from 'express';
import { Post } from '../models/Post';

export const createPost = async (req: Request, res: Response) => {
    try {
        const { author, title, content } = req.body;
        const post = new Post({ author, title, content });
        await post.save();
        res.status(201).send(post);
    } catch (error) {
        res.status(400).send(error);
    }
};

// 其他CRUD操作...

步骤7:添加路由

为Blog API创建CRUD必需的路由。在src/routes目录下,创建blogRoutes.ts

import express from 'express';
import { createPost, readPost, readPosts, updatePost, deletePost } from '../controllers/postController';

const router = express.Router();

router.post('/post', createPost);
router.get('/posts', readPosts);
router.get('/post/:id', readPost);
router.put('/post/:id', updatePost);
router.delete('/post/:id', deletePost);

export default router;

步骤8:配置MongoDB

设置数据库连接,在src/config/db.ts中添加:

import mongoose from 'mongoose';

export default function connectDB() {
    const mongoURI = process.env.MONGODB_URI ?? 'mongodb://localhost:27017/mydatabase';
    mongoose.connect(mongoURI);
    // 错误处理和连接成功的日志
    mongoose.connection.once("open", (_) => {
        console.log(`Database connected`);
    }).on("error", (err) => {
        console.error(`Database connection error: ${err}`);
    });
}

步骤9:整合所有组件

将模型、路由和控制器整合到index.ts文件中,准备启动应用:

import express from "express";
import postRoute from "./routes/postRoute";
import connectDB from "./config/db";

const app = express();
const port = process.env.APP_PORT || 8080;

// 连接数据库
connectDB();

// 中间件
app.use(express.urlencoded({ extended: true }));
app.use('/api/post', postRoute);

app.listen(port, () => {
    console.log(`Listening on port: ${port}`);
});

这样,您的API就准备好了,可以通过Bun来运行。


额外补充

添加监控和日志记录

监控和日志记录对于了解应用程序的运行状态、调试和性能优化至关重要。以下是如何在Express.js应用程序中添加日志记录的步骤:

使用Morgan进行请求日志记录

Morgan是一个流行的HTTP请求日志记录中间件,可以帮助您跟踪应用程序的请求数据。

  1. 安装Morgan
  2. 在Express应用中使用Morgan
    在您的Express应用中,添加Morgan作为中间件来自动记录所有进入的请求。
import express from 'express';
import morgan from 'morgan'; 
const app = express(); // 使用Morgan中间件 
app.use(morgan('dev')); // 'dev'是预定义的日志格式之一 // 其余的应用设置..

使用express-validator进行数据验证

数据验证是确保应用程序接收到的数据符合预期格式和类型的重要步骤。express-validator是一个基于validator.js的中间件,用于验证和清理请求对象。

安装express-validator:

bun add express-validator 
bun add -d @types/express-validator

在路由中使用express-validator进行验证: 

在定义路由处理函数之前,使用express-validator来验证请求体、查询参数或URL参数。

import { body, validationResult } from 'express-validator';
import express from 'express';

const app = express();
app.use(express.json());

app.post('/post', [
  // 验证规则
  body('title').notEmpty().withMessage('Title is required'),
  body('content').isLength({ min: 5 }).withMessage('Content must be at least 5 characters long'),
], (req, res) => {
  // 检查验证结果
  const errors = validationResult(req);
  if (!errors.isEmpty()) {
    return res.status(400).json({ errors: errors.array() });
  }

  // 如果数据有效,继续处理请求
  // ...
});

// 其余的应用设置...

在这个例子中,我们为/post路由添加了两个验证规则:确保title字段不为空,以及content字段至少有5个字符长。如果请求数据不符合这些规则,将返回400状态码和错误信息。

通过这些步骤,您可以有效地在Express.js应用程序中添加监控和日志记录功能,并使用express-validator确保处理的数据是有效和安全的。