手把手教你用 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 场景
相关推荐
做运维的阿瑞3 小时前
Python零基础入门:30分钟掌握核心语法与实战应用
开发语言·后端·python·算法·系统架构
猿究院-陆昱泽3 小时前
Redis 五大核心数据结构知识点梳理
redis·后端·中间件
yuriy.wang4 小时前
Spring IOC源码篇五 核心方法obtainFreshBeanFactory.doLoadBeanDefinitions
java·后端·spring
咖啡教室6 小时前
程序员应该掌握的网络命令telnet、ping和curl
运维·后端
你的人类朋友7 小时前
Let‘s Encrypt 免费获取 SSL、TLS 证书的原理
后端
老葱头蒸鸡7 小时前
(14)ASP.NET Core2.2 中的日志记录
后端·asp.net
李昊哲小课7 小时前
Spring Boot 基础教程
java·大数据·spring boot·后端
码事漫谈7 小时前
C++内存越界的幽灵:为什么代码运行正常,free时却崩溃了?
后端
Swift社区8 小时前
Spring Boot 3.x + Security + OpenFeign:如何避免内部服务调用被重复拦截?
java·spring boot·后端
90后的晨仔8 小时前
Mac 上配置多个 Gitee 账号的完整教程
前端·后端