视频教程:BV1vVyeYMEAs
视频链接:BV1vVyeYMEAs
发布日期:2024-10-21
视频时长:21:51
播放量:27.7万
所属合集:零基础AI全栈开发系列
视频概要
后端开发的第一课。使用Node.js + Express框架搭建后端服务器,创建RESTful API接口,并连接MongoDB数据库。覆盖服务端概念、Express路由、中间件、CORS跨域、Mongoose数据模型、云函数/Serverless等知识。
知识点清单
A. Node.js 基础
| 知识点 | 说明 | 重要程度 |
|---|---|---|
| Node.js是什么 | 基于Chrome V8引擎的JavaScript运行时,让JS可以在浏览器外运行 | ★★★★★ |
| 为什么学Node.js | 前后端同一种语言,降低学习成本 | ★★★★★ |
| npm | Node Package Manager,包管理工具 | ★★★★★ |
| CommonJS | Node.js传统模块系统(require/module.exports) | ★★★★ |
| ES Modules | 新一代模块系统(import/export),推荐使用 | ★★★★ |
| nvm | Node版本管理器,方便切换不同Node版本 | ★★★★ |
# 验证Node.js安装
node -v # 查看版本
npm -v # 查看npm版本
# 初始化项目
mkdir my-server
cd my-server
npm init -y # 生成 package.json
# 安装Express
npm install express
# 设置国内镜像(加速下载)
npm config set registry https://registry.npmmirror.com
B. Express 框架
// index.js
const express = require('express');
const app = express();
const port = 3000;
// 中间件:解析JSON请求体
app.use(express.json());
// 中间件:跨域支持(CORS)
app.use((req, res, next) => {
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Methods', 'GET,POST,PUT,DELETE');
res.header('Access-Control-Allow-Headers', 'Content-Type');
next();
});
// 路由:GET 获取列表
app.get('/get_list', async (req, res) => {
try {
const todos = await Todo.find();
res.json({ code: 200, data: todos });
} catch (error) {
res.status(500).json({ code: 500, message: '服务器错误' });
}
});
// 路由:POST 添加数据
app.post('/add', async (req, res) => {
const { name } = req.body;
const todo = new Todo({ name, completed: false });
await todo.save();
res.json({ code: 200, message: "添加成功" });
});
// 路由:PUT 更新数据
app.put('/update_todo', async (req, res) => {
const { id, completed } = req.body;
await Todo.findByIdAndUpdate(id, { completed });
res.json({ code: 200, message: "更新成功" });
});
// 路由:DELETE 删除数据
app.delete('/del_todo', async (req, res) => {
await Todo.findByIdAndDelete(req.body.id);
res.json({ code: 200, message: "删除成功" });
});
// 启动服务器
app.listen(port, () => {
console.log(`服务器运行在 http://localhost:${port}`);
});
C. Express核心概念
| 概念 | 说明 | 示例 |
|---|---|---|
| 路由(Routing) | URL路径与处理函数的映射 | app.get('/users', handler) |
| 中间件(Middleware) | 请求处理管道中的函数,可在路由前后执行 | app.use(express.json()) |
| req(请求对象) | 包含客户端发来的数据 | req.body(POST数据), req.params(URL参数), req.query(查询参数) |
| res(响应对象) | 用于向客户端返回数据 | res.json(), res.send(), res.status() |
| listen | 服务器绑定端口等待请求 | app.listen(3000) |
| next() | 中间件中调用,传递到下一个处理函数 | next() |
D. 项目目录结构
my-server/
├── package.json # 项目配置和依赖列表
├── package-lock.json # 依赖锁定文件
├── node_modules/ # 依赖包(npm install自动生成)
├── index.js # 入口文件(服务器启动)
├── routes/ # 路由目录
│ └── api.js # API路由定义
├── models/ # 数据模型目录
│ └── todo.js # Todo数据模型
└── config/ # 配置文件目录
└── db.js # 数据库连接配置
E. MongoDB + Mongoose
// 安装: npm install mongoose
const mongoose = require('mongoose');
// 连接数据库
mongoose.connect('mongodb://localhost:27017/mydb');
// 定义数据模型(Schema)
const todoSchema = new mongoose.Schema({
title: String,
completed: Boolean,
createdAt: { type: Date, default: Date.now }
});
const Todo = mongoose.model('Todo', todoSchema);
// CRUD 操作
// 创建
const newTodo = new Todo({ title: "学习Node.js", completed: false });
await newTodo.save();
// 查询所有
const todos = await Todo.find();
// 条件查询
const completed = await Todo.find({ completed: true });
// 按ID查询
const todo = await Todo.findById("some_id");
// 更新
await Todo.findByIdAndUpdate("some_id", { completed: true });
// 删除
await Todo.findByIdAndDelete("some_id");
F. MongoDB核心概念
| 知识点 | 说明 | SQL对应 |
|---|---|---|
| 数据库(Database) | 数据的逻辑容器 | 数据库 |
| 集合(Collection) | 文档的集合 | 表(Table) |
| 文档(Document) | 单条数据记录,JSON格式 | 行(Row) |
| 字段(Field) | 文档中的键值对 | 列(Column) |
| _id | 自动生成的唯一标识 | 主键(Primary Key) |
| Mongoose | Node.js的MongoDB ODM工具 | ORM |
G. 云函数/Serverless
| 知识点 | 说明 | 重要程度 |
|---|---|---|
| Serverless | 无需管理服务器的后端方案 | ★★★ |
| 云函数 | 上传代码,平台自动运行 | ★★★ |
| 按需计费 | 用的时候才启动,不用不收费 | ★★★ |
| 与传统服务器区别 | Serverless按调用计费,传统服务器按时间计费 | ★★★ |
注意:Serverless并不是真的没有服务器,而是开发者不需要管理服务器。
常见问题
| 问题 | 解答 |
|---|---|
| Node.js和JavaScript什么关系? | Node.js让JS可以在浏览器外运行,用同一种语言写前后端 |
| 服务器一直在starting? | 可能是网络问题,等10分钟左右;或检查端口是否被占用 |
| CORS跨域错误怎么解决? | 在Express中添加CORS中间件,设置 Access-Control-Allow-Origin: * |
| npm i要在哪运行? | 在项目目录(如my-vue-app)中运行,不是在根目录 |
| localhost:3000打不开? | 确认服务器已启动(控制台显示"服务器运行在"),检查端口 |
| 接口和路由是什么关系? | 路由就是接口的实现,一个URL路径对应一个处理函数 |
| Mongoose和MongoDB什么关系? | Mongoose是Node.js操作MongoDB的工具库,封装了底层操作 |
前置知识检查
- [x] 了解JavaScript基础语法
- [x] 了解HTTP请求方法(GET/POST/PUT/DELETE)
- [x] 会使用npm安装依赖
- [x] 了解JSON数据格式
学习建议
- 本集是从"前端开发者"到"全栈开发者"的跨越,重点理解Express路由和中间件
- CORS跨域是新手最常遇到的问题,中间件设置务必加上
- MongoDB连接串中的
mydb可以自定义,数据库不存在时会自动创建 - 建议在Sealos上创建云数据库,跟着练习