所有文章 > API开发工具 > 使用 Node.js 和 Express 构建 REST API:完整教程
使用 Node.js 和 Express 构建 REST API:完整教程

使用 Node.js 和 Express 构建 REST API:完整教程

引言

在这篇教程中,我们将介绍如何使用 Node.jsExpressMongoDB 构建一个功能齐全的 RESTful API。这个教程适合 编程初学者Web 开发爱好者,通过实际项目来学习如何进行 API 开发、数据库连接以及后端开发中的常见操作。

环境准备

安装 Node.js 和 Express


首先,确保你已经安装了 Node.js。然后,我们使用 Express 来简化 API 的创建流程:

  1. 初始化 Node.js 项目:

    npm init -y
  2. 安装 ExpressMongoose(用于与 MongoDB 交互):

    npm install express mongoose

安装开发工具


接下来,我们安装开发时常用的工具:

  1. dotenv:处理环境变量。
  2. nodemon:自动重启服务器。
npm install --save-dev dotenv nodemon

创建服务器

配置 Express 服务器

server.js 文件中配置服务器:

const express = require('express');
const app = express();
const mongoose = require('mongoose');
const dotenv = require('dotenv');

// 加载环境变量
dotenv.config();

// 连接 MongoDB
mongoose.connect(process.env.DATABASE_URL, { useNewUrlParser: true, useUnifiedTopology: true })
  .then(() => console.log('连接到数据库成功'))
  .catch((err) => console.error('连接数据库失败:', err));

app.listen(3000, () => {
  console.log('服务器启动,监听端口 3000');
});

配置数据库连接

使用 Mongoose 连接到 MongoDB 数据库。我们将数据库连接字符串存储在 .env 文件中,以避免泄露敏感信息:

DATABASE_URL=mongodb://localhost:27017/subscribers

创建数据库模型

定义订阅者模型

接下来,使用 Mongoose 创建一个订阅者模型:

const mongoose = require('mongoose');

const subscriberSchema = new mongoose.Schema({
  name: {
    type: String,
    required: true
  },
  subscribedToChannel: {
    type: String,
    required: true
  },
  subscribeDate: {
    type: Date,
    required: true,
    default: Date.now
  }
});

module.exports = mongoose.model('Subscriber', subscriberSchema);

创建路由

配置 RESTful 路由

我们为订阅者创建以下 API 路由:

  • GET /subscribers:获取所有订阅者。
  • GET /subscribers/:id:根据 ID 获取特定订阅者。
  • POST /subscribers:添加新的订阅者。
  • PATCH /subscribers/:id:更新订阅者信息。
  • DELETE /subscribers/:id:删除订阅者。
const express = require('express');
const Subscriber = require('./models/subscriber');
const router = express.Router();

// 获取所有订阅者
router.get('/subscribers', async (req, res) => {
  try {
    const subscribers = await Subscriber.find();
    res.json(subscribers);
  } catch (err) {
    res.status(500).json({ message: '服务器错误' });
  }
});

// 获取指定 ID 的订阅者
router.get('/subscribers/:id', async (req, res) => {
  try {
    const subscriber = await Subscriber.findById(req.params.id);
    if (!subscriber) {
      return res.status(404).json({ message: '未找到订阅者' });
    }
    res.json(subscriber);
  } catch (err) {
    res.status(500).json({ message: '服务器错误' });
  }
});

// 添加新订阅者
router.post('/subscribers', async (req, res) => {
  const subscriber = new Subscriber({
    name: req.body.name,
    subscribedToChannel: req.body.subscribedToChannel
  });

  try {
    const newSubscriber = await subscriber.save();
    res.status(201).json(newSubscriber);
  } catch (err) {
    res.status(400).json({ message: '请求无效,缺少必填字段' });
  }
});

// 更新订阅者
router.patch('/subscribers/:id', async (req, res) => {
  try {
    const subscriber = await Subscriber.findById(req.params.id);
    if (!subscriber) {
      return res.status(404).json({ message: '未找到订阅者' });
    }
    if (req.body.name) subscriber.name = req.body.name;
    if (req.body.subscribedToChannel) subscriber.subscribedToChannel = req.body.subscribedToChannel;

    const updatedSubscriber = await subscriber.save();
    res.json(updatedSubscriber);
  } catch (err) {
    res.status(400).json({ message: '请求无效' });
  }
});

// 删除订阅者
router.delete('/subscribers/:id', async (req, res) => {
  try {
    const subscriber = await Subscriber.findById(req.params.id);
    if (!subscriber) {
      return res.status(404).json({ message: '未找到订阅者' });
    }
    await subscriber.remove();
    res.json({ message: '已删除订阅者' });
  } catch (err) {
    res.status(500).json({ message: '服务器错误' });
  }
});

module.exports = router;

设置中间件

通过中间件函数 getSubscriber 来获取订阅者信息,避免在每个路由中重复代码。

const getSubscriber = async (req, res, next) => {
  try {
    const subscriber = await Subscriber.findById(req.params.id);
    if (!subscriber) {
      return res.status(404).json({ message: '未找到订阅者' });
    }
    res.subscriber = subscriber;
    next();
  } catch (err) {
    res.status(500).json({ message: '服务器错误' });
  }
};

测试和调试

使用 PostmanVisual Studio Code 的 REST Client 插件测试 API 路由,确保 CRUD 操作(创建、读取、更新、删除)都能正常工作。

示例请求

  1. 获取所有订阅者

    GET http://localhost:3000/subscribers
  2. 添加订阅者

    POST http://localhost:3000/subscribers
    Content-Type: application/json
    
    {
     "name": "John Doe",
     "subscribedToChannel": "Web Dev Simplified"
    }

总结

通过本教程,我们学习了如何使用 Node.jsExpressMongoDB 创建一个 RESTful API。从环境设置到数据库操作,再到路由配置和中间件,您已经掌握了构建 API 的基础知识。接下来,您可以根据需求扩展该 API,加入更多功能,优化性能,或进行安全加固。

原文引自YouTube视频:https://www.youtube.com/watch?v=fgTGADljAeg

#你可能也喜欢这些API文章!

我们有何不同?

API服务商零注册

多API并行试用

数据驱动选型,提升决策效率

查看全部API→
🔥

热门场景实测,选对API

#AI文本生成大模型API

对比大模型API的内容创意新颖性、情感共鸣力、商业转化潜力

25个渠道
一键对比试用API 限时免费

#AI深度推理大模型API

对比大模型API的逻辑推理准确性、分析深度、可视化建议合理性

10个渠道
一键对比试用API 限时免费