手把手教你用 Node.js + MongoDB 搭建 RESTful API 服务

🧭 一、项目背景与技术选型

🧩 场景说明:

本项目模拟一个博客系统后端接口,具备以下功能:

  • 用户注册、登录(JWT 鉴权)
  • 文章增删改查
  • 评论系统
  • 基础的权限控制

🔧 技术选型:

模块 技术
语言 Node.js (v18+)
框架 Express
数据库 MongoDB(使用 mongoose ODM)
身份认证 JWT
接口测试 Postman

🧱 二、项目结构预览

lua 复制代码
lua
复制编辑
blog-api/
├── app.js
├── config/
│   └── db.js
├── controllers/
│   ├── auth.js
│   ├── posts.js
├── models/
│   ├── user.js
│   ├── post.js
├── routes/
│   ├── auth.js
│   ├── posts.js
├── middlewares/
│   └── auth.js
└── package.json

⚙️ 三、环境准备与初始化

bash 复制代码
bash
复制编辑
mkdir blog-api && cd blog-api
npm init -y
npm install express mongoose bcryptjs jsonwebtoken dotenv cors
npm install --save-dev nodemon

.env 配置:

ini 复制代码
ini
复制编辑
PORT=5000
MONGO_URI=mongodb://localhost:27017/blog-api
JWT_SECRET=yourSecretKey

🧩 四、数据库模型设计(Mongoose)

用户模型 user.js

javascript 复制代码
js
复制编辑
const mongoose = require('mongoose');
const bcrypt = require('bcryptjs');

const userSchema = new mongoose.Schema({
  username: { type: String, required: true, unique: true },
  password: { type: String, required: true }
});

userSchema.pre('save', async function(next) {
  this.password = await bcrypt.hash(this.password, 10);
  next();
});

module.exports = mongoose.model('User', userSchema);

🔐 五、JWT 鉴权中间件

middlewares/auth.js

ini 复制代码
js
复制编辑
const jwt = require('jsonwebtoken');

module.exports = (req, res, next) => {
  const token = req.header('Authorization')?.split(' ')[1];
  if (!token) return res.status(401).json({ msg: 'No token, auth denied' });

  try {
    const decoded = jwt.verify(token, process.env.JWT_SECRET);
    req.user = decoded.user;
    next();
  } catch {
    res.status(401).json({ msg: 'Token is not valid' });
  }
};

📨 六、用户注册与登录接口

controllers/auth.js(简略):

ini 复制代码
js
复制编辑
exports.register = async (req, res) => {
  const { username, password } = req.body;
  const user = new User({ username, password });
  await user.save();
  res.json({ msg: 'User created' });
};

exports.login = async (req, res) => {
  const { username, password } = req.body;
  const user = await User.findOne({ username });
  const isMatch = await bcrypt.compare(password, user.password);
  if (!isMatch) return res.status(400).json({ msg: 'Invalid credentials' });

  const token = jwt.sign({ user: { id: user.id } }, process.env.JWT_SECRET);
  res.json({ token });
};

📃 七、文章增删改查 API 示例

Post 模型

php 复制代码
js
复制编辑
const mongoose = require('mongoose');

const postSchema = new mongoose.Schema({
  title: String,
  content: String,
  author: { type: mongoose.Schema.Types.ObjectId, ref: 'User' },
}, { timestamps: true });

module.exports = mongoose.model('Post', postSchema);

控制器 posts.js(简要)

ini 复制代码
js
复制编辑
exports.createPost = async (req, res) => {
  const post = new Post({ ...req.body, author: req.user.id });
  await post.save();
  res.json(post);
};

exports.getPosts = async (req, res) => {
  const posts = await Post.find().populate('author', 'username');
  res.json(posts);
};

📡 八、接口测试与运行方式

启动服务:

复制代码
bash
复制编辑
npx nodemon app.js

Postman 测试顺序建议:

  1. 注册 → /api/auth/register
  2. 登录获取 token → /api/auth/login
  3. 携带 token 调用文章接口 → /api/posts

📦 九、可扩展方向

  • 接入 Swagger API 文档
  • 引入 Redis 做缓存
  • Docker 化部署
  • 统一错误处理(Error Handler 中间件)

✅ 十、项目总结

  • Node + MongoDB 非常适合中小型 RESTful 服务开发
  • 通过 Express + Mongoose 能快速建模与部署
  • JWT 鉴权简单有效,适合移动端、SPA 场景
相关推荐
代码栈上的思考34 分钟前
消息队列:内存与磁盘数据中心设计与实现
后端·spring
程序员小假1 小时前
我们来说一下 b+ 树与 b 树的区别
java·后端
Meepo_haha2 小时前
Spring Boot 条件注解:@ConditionalOnProperty 完全解析
java·spring boot·后端
sheji34162 小时前
【开题答辩全过程】以 基于springboot的房屋租赁系统的设计与实现为例,包含答辩的问题和答案
java·spring boot·后端
Victor3563 小时前
MongoDB(57)如何优化MongoDB的查询性能?
后端
Victor3563 小时前
MongoDB(58)如何使用索引优化查询?
后端
行百里er3 小时前
优雅应对异常,从“try-catch堆砌”到“设计驱动”
java·后端·代码规范
码财小子3 小时前
聊聊 C++ 模块“注册式”的优雅姿势
后端·代码规范
掘金码甲哥4 小时前
higress 这个中登才是AI时代的心头好
后端
IT_陈寒4 小时前
一文搞懂JavaScript的核心概念
前端·人工智能·后端