楼层: 首页/ 软件技术/ Node.js 全栈实战/ 数据库访问:数据往哪儿存
08

数据库访问:数据往哪儿存

Databases · SQL & NoSQL & ORM

光有接口不存数据,接口就是个空壳。这一章讲 Node 怎么连数据库:关系型数据库(MySQL/PostgreSQL,表格思维)、NoSQL(MongoDB,文档思维)、缓存(Redis),以及帮你少写 SQL 的 ORM 工具。

原生 SQL:先懂 mysql2 的连接池

// npm i mysql2 (注意是 mysql2,不是老的 mysql) import mysql from "mysql2/promise"; // 连接池:提前开好一批连接,用的时候直接取,用完还回去 const pool = mysql.createPool({ host: "localhost", user: "root", password: "你的密码", database: "blog", waitForConnections: true, connectionLimit: 10, // 最多同时开 10 个连接 }); // 关键:用 ? 占位符做参数化查询,防 SQL 注入! async function getUserById(id) { const [rows] = await pool.execute( "SELECT * FROM users WHERE id = ?", [id] // 用户传进来的值,放数组里,库自动转义 ); return rows[0]; }
安全红线:SQL 注入

千万别写成 `SELECT * FROM users WHERE id = ${userInput}` 这种字符串拼接。坏人传进来 "1; DROP TABLE users;",你的表就没了。永远用 ? 占位符 + 参数数组,让驱动替你转义。这一条能挡掉最经典的攻击。

ORM:用对象代替手写 SQL

手写 SQL 容易写错、类型还不安全。ORM(对象关系映射)让你用操作 JavaScript 对象的方式操作数据库,它在背后帮你生成 SQL。三个主流选手:

ORM特点
Prisma 5+新一代明星。先写一个 Schema 文件描述表结构,它自动生成类型安全的客户端,查询语句直观又智能。新项目首选。
TypeORMTypeScript 老牌,用装饰器定义实体(@Entity、@Column),和 NestJS 天然搭配。
Sequelize最老牌的传统 ORM,JavaScript 项目用得多,TypeScript 支持不如前两个。

Prisma 三板斧:Schema → 生成 → 查询

// 第一步:prisma/schema.prisma —— 用这种 DSL 描述表结构 model User { id Int @id @default(autoincrement()) email String @unique name String? posts Post[] // 一个用户有多篇文章(一对多) } model Post { id Int @id @default(autoincrement()) title String author User? @relation(fields: [authorId], references: [id]) authorId Int? }
// 第二步:命令行同步到数据库并生成客户端 # npx prisma db push 把 schema 推到数据库 # npx prisma generate 生成类型安全的查询客户端 // 第三步:业务代码里查询,自动补全 + 类型安全 import { PrismaClient } from "@prisma/client"; const prisma = new PrismaClient(); // 查所有用户,连他们的文章一起带出来 const users = await prisma.user.findMany({ include: { posts: true } });

NoSQL:MongoDB 与 Redis

MongoDB → 存文档,像存 JSON
用 mongoose 包,定义 Schema 和 Model,做 CRUD 和聚合。
什么时候用:数据结构不固定、经常变,或者像评论、日志这种"一条条 JSON"的场景。它不强制表结构,存起来灵活。
Redis → 内存数据库,极快的缓存
用 ioredis 或 node-redis。数据放内存里,读起来快到飞起。
干什么用:缓存热点数据(别每次都查 MySQL)、存登录会话、做接口限流计数器、消息队列、发布订阅。是性能优化的标配,后面查得慢的接口先想想能不能塞 Redis。
数据库一句话选型建议
SQLite本地小数据库,一个文件就是一个库,零配置。小项目、练手、桌面应用首选,配合 better-sqlite3 很爽。
MySQL互联网世界最普及的关系型库,生态成熟,国内公司用得最多。
PostgreSQL功能更强的关系型库(JSON、地理、复杂查询),新项目呼声越来越高。
MongoDB结构灵活的文档库,前端团队上手快。
Redis不管主力库是谁,它都该在场——做缓存和计数器。
记
本章小结

① 练手用 SQLite + Prisma,零配置又类型安全,体验最好。

② 写 SQL 永远用占位符防注入;生产用连接池,别每查一次开一个连接。

③ 热点数据往 Redis 塞,是最便宜的性能优化。