本课是全栈开发的收尾核心课,聚焦MongoDB数据库实战,彻底打通数据持久化环节。MongoDB作为文档型数据库,语法贴合JavaScript,搭配Node.js极易上手,完美适配前端全栈学习路径。课程从环境搭建、连接数据库,到Schema定义、CRUD操作,再到Node.js接口整合,层层递进,用单词存储案例贯穿全程,通俗易懂。学习本课不仅能掌握数据库基础操作,更能建立完整的全栈开发思维,实现数据从前端到后端再到数据库的闭环流转。MongoDB持久化存储解决了本地文件数据丢失的问题,是企业级项目的基础技能,掌握本课内容,标志着完成从纯前端到全栈开发者的进阶。
一、课程学习目的
-
理解MongoDB数据库的核心特性、适用场景,掌握文档型数据库的基础概念。
-
学会MongoDB的安装、启动、连接,熟练使用 Compass 可视化工具管理数据。
-
掌握Node.js连接MongoDB的方法,实现数据的增删改查(CRUD)基础操作。
-
能够结合Node.js后端,搭建完整的"后端+数据库"接口服务,实现数据持久化存储。
-
理解数据库、集合、文档的层级关系,学会规范设计数据结构。
-
打通全栈开发最后一环,实现前端---后端---数据库的数据互通,完成完整全栈小项目。
二、核心知识点讲解
1. MongoDB 基础认知
MongoDB是一款开源的文档型NoSQL数据库,数据以BSON格式(类似JSON)存储,结构灵活,无需固定表字段,适合前端全栈项目、快速开发、数据结构多变的场景。
核心概念对应:数据库(database)对应库、集合(collection)对应表、文档(document)对应行数据,学习门槛低,和JavaScript语法契合度高。
相比传统关系型数据库,MongoDB无需编写复杂SQL语句,API简洁易懂,配合Node.js开发效率极高,是前端全栈入门首选数据库。
2. MongoDB 核心工具与环境
MongoDB Server:数据库核心服务,负责数据存储与读取。
MongoDB Compass:官方可视化工具,直观查看、新增、修改、删除数据,无需命令行操作。
Mongoose:Node.js环境下的MongoDB对象模型库,封装了连接、操作数据库的API,简化代码,支持数据验证,是开发必备依赖。
3. Mongoose 核心流程
-
安装Mongoose依赖,引入库并连接MongoDB服务。
-
定义Schema(数据模式),规定字段类型、必填项等规则。
-
根据Schema创建Model(模型),Model是操作集合的核心入口。
-
调用Model方法,实现数据的增删改查(CRUD)。
4. MongoDB 基础操作(CRUD)
-
新增数据:Model.create()、new Model().save()
-
查询数据:Model.find()、Model.findOne()、findById()
-
修改数据:Model.updateOne()、findByIdAndUpdate()
-
删除数据:Model.deleteOne()、findByIdAndDelete()
5. 全栈数据流转流程
前端发送请求 → Node.js后端接收请求 → 调用Mongoose操作MongoDB → 数据库返回结果 → 后端将结果返回给前端,完成完整数据交互。
三、示例程序(带详细注释)
示例1:Node.js连接MongoDB(Mongoose)
javascript
// 引入mongoose
const mongoose = require('mongoose');
// 数据库连接地址(本地默认地址)
const url = 'mongodb://localhost:27017/wordDB';
// 连接数据库
mongoose.connect(url)
.then(() => console.log('MongoDB连接成功'))
.catch(err => console.log('连接失败', err));
示例2:定义Schema与Model
javascript
// 定义单词数据模式(规定字段规则)
const wordSchema = new mongoose.Schema({
// 英文单词,字符串,必填
en: { type: String, required: true },
// 中文释义,字符串,必填
cn: { type: String, required: true },
// 创建时间,默认当前时间
createTime: { type: Date, default: Date.now }
});
// 创建模型(集合名称:words,对应数据库中的集合)
const Word = mongoose.model('Word', wordSchema);
// 导出模型,供接口使用
module.exports = Word;
示例3:数据增删改查操作
javascript
const Word = require('./model/wordModel');
// 1. 新增单词
async function addWord(en, cn) {
const res = await Word.create({ en, cn });
console.log('新增成功', res);
}
// 2. 查询所有单词
async function findAllWord() {
const list = await Word.find();
console.log('单词列表', list);
}
// 3. 根据id修改单词
async function updateWord(id, en, cn) {
const res = await Word.findByIdAndUpdate(id, { en, cn });
console.log('修改成功');
}
// 4. 根据id删除单词
async function deleteWord(id) {
const res = await Word.findByIdAndDelete(id);
console.log('删除成功');
}
示例4:结合Node.js接口
javascript
const http = require('http');
const Word = require('./model/wordModel');
const server = http.createServer(async (req, res) => {
// 设置响应头
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Content-Type', 'application/json;charset=utf-8');
// 获取单词列表接口
if (req.url === '/api/word/list' && req.method === 'GET') {
const list = await Word.find();
res.end(JSON.stringify(list));
}
});
// 启动服务
server.listen(3000, () => {
console.log('服务启动:http://localhost:3000');
});
四、掌握技巧与方法
-
操作MongoDB数据库前,必须先启动MongoDB服务,否则连接失败。
-
使用Mongoose时,先定义Schema约束数据格式,避免脏数据存入数据库。
-
所有数据库操作都是异步任务,必须使用async/await接收结果,防止数据获取不全。
-
数据库名称、集合名称语义化,便于后期维护和扩展。
-
调试数据时,配合MongoDB Compass可视化工具,直观查看数据变化。
-
接口路径统一加前缀(如/api/),区分普通地址和接口地址。
-
处理异步操作时,添加try/catch捕获错误,提升服务稳定性。
-
数据id采用MongoDB自动生成的_id,唯一且稳定,适合作为操作依据。
五、课后作业
基础作业
-
安装MongoDB服务和Compass工具,启动服务并连接成功。
-
初始化项目,安装Mongoose依赖,编写代码连接本地数据库。
-
定义单词数据Schema,创建对应的Model模型。
进阶作业
-
实现单词数据的新增、查询、修改、删除四项基础操作。
-
使用Compass查看数据库数据,核对操作结果。
-
封装数据库操作函数,便于复用和维护。
实战作业
- 结合Node.js搭建完整全栈服务,实现获取单词列表、新增单词、删除单词接口,数据存入MongoDB实现持久化,接入前端页面完成前后端数据交互,代码规范、注释完整,纳入Git版本管理。
上一课:Node.js 后端基础 实战作业代码
代码功能说明
本实战作业基于Node.js原生模块,搭建完整的后端接口服务,实现单词数据管理功能。项目使用http模块搭建服务器,监听指定端口,处理前端跨域请求;通过fs模块读取本地json文件存储单词数据,实现获取单词列表、查询单个单词两大接口;配置完整响应头,返回标准JSON格式数据,支持前端页面直接调用。代码结构清晰,注释详尽,区分路由地址,处理异常情况,完整覆盖Node.js后端基础知识点,演示原生后端服务搭建、文件读写、前后端交互的全流程,适合巩固后端入门知识。
注意事项
-
运行代码前必须安装Node.js环境,验证node -v命令可用。
-
启动服务命令:node 文件名.js,修改代码后需关闭服务重新启动。
-
确保word.json文件和主代码文件路径一致,防止文件读取失败。
-
必须配置跨域响应头,否则前端页面无法正常请求接口。
-
端口号避免占用,若提示端口占用,可修改为8080、9000等其他端口。
-
返回数据必须用JSON.stringify转为字符串,前端才能正常解析。
-
关闭服务使用Ctrl+C,不要直接关闭终端,防止端口残留占用。
-
不要手动修改word.json格式,避免语法错误导致读取失败。
完整实战代码
项目结构
Plain
node-server-demo/
├── server.js # 后端服务主文件
└── word.json # 数据存储文件
word.json(数据文件)
json
[
{"en": "apple", "cn": "苹果", "id": 1},
{"en": "banana", "cn": "香蕉", "id": 2},
{"en": "orange", "cn": "橙子", "id": 3},
{"en": "book", "cn": "书本", "id": 4}
]
server.js(服务主文件)
javascript
// 导入核心模块
const http = require('http');
const fs = require('fs');
const path = require('path');
// 拼接数据文件路径
const filePath = path.join(__dirname, 'word.json');
// 创建服务器
const server = http.createServer((req, res) => {
// 配置响应头:解决跨域、设置编码格式
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Content-Type', 'application/json;charset=utf-8');
res.setHeader('Access-Control-Allow-Methods', 'GET,POST');
// 读取单词数据
const readWordData = () => {
try {
const data = fs.readFileSync(filePath, 'utf8');
return JSON.parse(data);
} catch (err) {
return [];
}
};
// 1. 获取所有单词列表接口
if (req.url === '/api/word/list' && req.method === 'GET') {
const list = readWordData();
res.end(JSON.stringify({
code: 200,
msg: '获取成功',
data: list
}));
return;
}
// 2. 404 接口不存在
res.writeHead(404);
res.end(JSON.stringify({
code: 404,
msg: '接口地址不存在'
}));
});
// 监听端口
const PORT = 3000;
server.listen(PORT, () => {
console.log(`Node.js服务启动成功`);
console.log(`接口地址:http://localhost:${PORT}/api/word/list`);
});
运行与测试
-
在项目文件夹打开终端,执行 node server.js 启动服务
-
浏览器访问 http://localhost:3000/api/word/list 查看返回数据
-
前端可通过fetch/axios直接调用该接口
作业验收标准
-
服务启动成功,终端无报错,能正常访问接口地址。
-
接口返回标准JSON格式数据,包含单词列表。
-
跨域配置生效,前端可正常请求并接收数据。
-
代码规范,注释清晰,模块引入和路径书写正确。
-
数据存储在本地json文件,读取正常,无格式报错。