JavaScript基础课程二十六、MongoDB 数据库实战

本课是全栈开发的收尾核心课,聚焦MongoDB数据库实战,彻底打通数据持久化环节。MongoDB作为文档型数据库,语法贴合JavaScript,搭配Node.js极易上手,完美适配前端全栈学习路径。课程从环境搭建、连接数据库,到Schema定义、CRUD操作,再到Node.js接口整合,层层递进,用单词存储案例贯穿全程,通俗易懂。学习本课不仅能掌握数据库基础操作,更能建立完整的全栈开发思维,实现数据从前端到后端再到数据库的闭环流转。MongoDB持久化存储解决了本地文件数据丢失的问题,是企业级项目的基础技能,掌握本课内容,标志着完成从纯前端到全栈开发者的进阶。

一、课程学习目的

  1. 理解MongoDB数据库的核心特性、适用场景,掌握文档型数据库的基础概念。

  2. 学会MongoDB的安装、启动、连接,熟练使用 Compass 可视化工具管理数据。

  3. 掌握Node.js连接MongoDB的方法,实现数据的增删改查(CRUD)基础操作。

  4. 能够结合Node.js后端,搭建完整的"后端+数据库"接口服务,实现数据持久化存储。

  5. 理解数据库、集合、文档的层级关系,学会规范设计数据结构。

  6. 打通全栈开发最后一环,实现前端---后端---数据库的数据互通,完成完整全栈小项目。

二、核心知识点讲解

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 核心流程

  1. 安装Mongoose依赖,引入库并连接MongoDB服务。

  2. 定义Schema(数据模式),规定字段类型、必填项等规则。

  3. 根据Schema创建Model(模型),Model是操作集合的核心入口。

  4. 调用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');
});

四、掌握技巧与方法

  1. 操作MongoDB数据库前,必须先启动MongoDB服务,否则连接失败。

  2. 使用Mongoose时,先定义Schema约束数据格式,避免脏数据存入数据库。

  3. 所有数据库操作都是异步任务,必须使用async/await接收结果,防止数据获取不全。

  4. 数据库名称、集合名称语义化,便于后期维护和扩展。

  5. 调试数据时,配合MongoDB Compass可视化工具,直观查看数据变化。

  6. 接口路径统一加前缀(如/api/),区分普通地址和接口地址。

  7. 处理异步操作时,添加try/catch捕获错误,提升服务稳定性。

  8. 数据id采用MongoDB自动生成的_id,唯一且稳定,适合作为操作依据。

五、课后作业

基础作业

  1. 安装MongoDB服务和Compass工具,启动服务并连接成功。

  2. 初始化项目,安装Mongoose依赖,编写代码连接本地数据库。

  3. 定义单词数据Schema,创建对应的Model模型。

进阶作业

  1. 实现单词数据的新增、查询、修改、删除四项基础操作。

  2. 使用Compass查看数据库数据,核对操作结果。

  3. 封装数据库操作函数,便于复用和维护。

实战作业

  1. 结合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`);
});

运行与测试

  1. 在项目文件夹打开终端,执行 node server.js 启动服务

  2. 浏览器访问 http://localhost:3000/api/word/list 查看返回数据

  3. 前端可通过fetch/axios直接调用该接口

作业验收标准

  1. 服务启动成功,终端无报错,能正常访问接口地址。

  2. 接口返回标准JSON格式数据,包含单词列表。

  3. 跨域配置生效,前端可正常请求并接收数据。

  4. 代码规范,注释清晰,模块引入和路径书写正确。

  5. 数据存储在本地json文件,读取正常,无格式报错。