本节摘要:Node.js 生态的数据库选择灵活——MongoDB 常用、SQL 也可。本节讲清两种接入方式(Mongoose 管 MongoDB、ORM 管 SQL)、模型定义与查询写法,以及"按数据形态选库"的决策思路。
阅读完本节,你应当能够:
"Node.js 用什么数据库?"——灵活是 Node 生态的特点:要灵活结构用 MongoDB(Mongoose),要严谨结构用 SQL(ORM/原生驱动)。选择不纠结,按"数据长什么样"决定。
数据访问的选择:
| 方式 | 数据库 | 特点 |
|---|---|---|
| Mongoose | MongoDB | 灵活文档 |
| ORM | SQL 系 | 严谨关系 |
const mongoose = require('mongoose') // 定义模型(对应集合) const User = mongoose.model('User', { name: String, age: Number, }) // 查询(异步!) app.get('/users', async (req, res) => { const users = await User.find() res.json(users) })
💡 关键直觉:Node 的数据操作是异步的——查询返回 Promise,用 await 拿结果。这是 Node 与 Spring/Django 最大的写法差异。
// 正确:await 拿结果 const users = await User.find() // 错误:忘了 await,拿到 Promise 而不是数据
⚠️ 常见坑:忘 await 或漏错误处理。异步操作要么 await,要么 catch——漏了,接口要么返回空、要么崩溃。
mongoose.connect('mongodb://localhost:27017/demo') .then(() => console.log('数据库已连接'))
数据灵活多变 → MongoDB 数据关系紧密 → SQL 入门练习 → 任一皆可,先跑通
数据通了,最后一节上异步与部署——异步编程与部署。
Q1:Node.js 生态里数据库怎么选?
核心看"数据长什么样":数据结构灵活多变、字段不固定(比如用户自定义字段、日志、消息),选 MongoDB;数据关系紧密、事务要求高(订单、账户、库存),选关系型数据库(MySQL/PostgreSQL)。入门练习阶段两者皆可,先跑通一种就好。Node 的生态两种都有成熟方案:Mongoose 管 MongoDB,Sequelize/TypeORM/Prisma 管 SQL。
Q2:Mongoose 和 MongoDB 是什么关系?
MongoDB 是数据库本身;Mongoose 是 Node 里操作 MongoDB 的"对象模型工具"——它让你定义"模型"(Schema + Model),提供增删改查方法,类似 ORM 但针对文档数据库。你定义一个 User 模型(name、age 字段),User.find() 查所有文档,User.create() 新增。它对标的是 Django ORM、Spring Data JPA 在各自生态里的位置。
Q3:为什么 Node 的数据操作总是带 await?
因为 Node 的所有数据库操作都是异步的(返回 Promise),你无法在操作完成前拿到结果。用 await 表示"等它完成再继续",这是 Node 的异步模型在数据层的直接体现。忘了 await,你会拿到一个 Promise 对象而不是数据,接口返回的就是"空壳"。记住这个规则:数据库查询前加 await,出错用 try/catch 兜住。
Q4:忘 await 或漏错误处理会怎样?
忘 await 拿到的不是数据,接口可能返回空对象或 Promise 被序列化成奇怪的东西;漏错误处理(try/catch 或 catch 方法),数据库查询出错时异常会向上抛,严重时进程直接崩溃。所以异步代码的两条底线:await 拿结果、catch 管异常。写每个数据接口都按这个套路,Node 的数据访问就稳了。
动手建议:选一种数据库实践一遍。如果选 MongoDB:装好 MongoDB,写一个 Mongoose 模型,在接口里用 await 查询并返回数据,注意 try/catch 包住异步操作。如果选 MySQL:装好驱动或 ORM,写一条插入和查询,同样用 await。重点体验"异步"带来的写法差异:哪里要 await、漏了会怎样、catch 怎么接。跑通后把常用增删改查各写一遍,Node 的数据访问你就有底了。
本节练习的目标,是让接口真正读写数据库,并吃透异步。步骤如下:
第一步,选库并准备。本地装好一种数据库(MongoDB 或 MySQL 均可),确认服务能启动。验收标准:数据库服务运行正常,能连接。
第二步,装驱动并连接。安装对应的驱动或 ORM 库,在应用启动时建立数据库连接,连接成功打印日志。验收标准:启动日志出现"数据库已连接"。
第三步,定义模型。用所选方案定义一个模型(字段:名字、年龄等),对应数据库中的集合或表。验收标准:模型定义存在,字段类型正确。
第四步,写查询接口。在 GET 接口里查询所有数据,用 await 等待结果,再返回。访问测试,确认返回数据库真实数据。验收标准:接口返回的数据来自数据库。
第五步,写写入接口。在 POST 接口里新增一条数据,保存后用查询接口确认数据已入库。验收标准:写入成功,数据持久化。
第六步,异步故障演练。故意去掉 await,访问接口观察返回;再故意不加错误处理让查询抛错,观察后果。修复后确认正常。验收标准:你亲身体会"忘 await、漏 catch"的两种后果。
六步走完,你的接口已经真实地读写数据库了,也把"异步数据操作"的规则刻进了记忆。这是 Node 后端开发最关键的一步。
Node 接数据库的关键词是"异步":连接用异步、查询用 await、异常用 catch。接一次真实库、跑通增删改查、故意忘一次 await,你的 Node 数据访问就真正落地了。