手把手教你用 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 场景
相关推荐
Code blocks3 小时前
关于“LoggerFactory is not a Logback LoggerContext but Logback is on ......“的解决方案
java·spring boot·后端
04Koi.6 小时前
八股训练--Spring
java·后端·spring
Livingbody8 小时前
【心理咨询师数字孪生对话数据集】标准化为 ShareGPT OpenAI 格式
后端
AQin10129 小时前
IP 🆚 MAC,你分得清吗?
后端·网络协议
天涯学馆9 小时前
Solidity 中的高级模式匹配:提升代码的可读性和可维护性
后端·区块链·solidity
郝学胜-神的一滴10 小时前
Spring Boot Actuator 保姆级教程
java·开发语言·spring boot·后端·程序人生
剪刀石头布啊10 小时前
数据口径
前端·后端·程序员
剪刀石头布啊10 小时前
http状态码大全
前端·后端·程序员
jiangxia_102411 小时前
面试系列:什么是JAVA并发编程中的JUC并发工具类
java·后端
用户15129054522011 小时前
踩坑与成长:WordPress、MyBatis-Plus 及前端依赖问题解决记录
前端·后端