JavaScript 直接访问数据库的能力
简短回答
| 数据库类型 | 能否直接访问? | 说明 |
|---|---|---|
| MongoDB | ✅ 可以 | 通过官方 Node.js 驱动(mongodb)直接在服务端连接 |
| MySQL | ✅ 可以 | 通过 Node.js 驱动(如 mysql2、sequelize、Prisma 等)在服务端连接 |
| 浏览器端 JS | ❌ 不可以 | 出于安全考虑,浏览器不允许直接连接数据库 |
1. MongoDB — 原生支持良好
MongoDB 最初就是为现代应用设计的,Node.js 有官方维护的驱动程序。
// 安装: npm install mongodb
const { MongoClient } = require('mongodb');
async function connect() {
const client = new MongoClient('mongodb://localhost:27017/mydb');
await client.connect();
const db = client.db('mydb');
const collection = db.collection('users');
// CRUD 操作
await collection.insertOne({ name: 'Alice', age: 30 });
const users = await collection.find({}).toArray();
console.log(users);
await client.close();
}
connect();
MongoDB 的文档模型与 JSON 天然契合,JavaScript 开发者体验非常好。
2. MySQL — 需要驱动/ORM
MySQL 是关系型数据库,JavaScript 通过连接器/驱动来访问:
方案一:原生驱动 mysql2
// 安装: npm install mysql2
const mysql = require('mysql2/promise');
async function query() {
const connection = await mysql.createConnection({
host: 'localhost',
user: 'root',
password: 'password',
database: 'mydb'
});
const [rows] = await connection.execute(
'SELECT * FROM users WHERE age > ?',
[18]
);
console.log(rows);
await connection.end();
}
query();
方案二:ORM/查询构建器(更推荐)
// Prisma 示例
import { PrismaClient } from '@prisma/client';
const prisma = new PrismaClient();
const users = await prisma.user.findMany({
where: { age: { gt: 18 } },
});
3. 关键限制:运行环境决定一切
┌─────────────────────────────────┐
│ 客户端(浏览器) │
│ ❌ 不能直接连接任何数据库 │
│ (安全风险:暴露凭证、SQL注入等) │
└──────────┬──────────────────────┘
│ HTTP/API 请求
┌──────────▼──────────────────────┐
│ 服务端(Node.js / Deno) │
│ ✅ 可以连接 MySQL / MongoDB │
│ ✅ 可执行完整的 CRUD 操作 │
└─────────────────────────────────┘
为什么浏览器不能直连?
- 🔒 安全:数据库凭证会暴露在客户端代码中
- 🛡️ 架构:违反分层架构原则,无法做权限控制、数据验证
- ⚠️ 网络:大多数数据库监听在私有网络,外部不可达
4. 最佳实践建议
| 场景 | 推荐方式 |
|---|---|
| 全栈 Node.js 项目 | 服务端使用驱动/ORM 直接连接数据库 |
| 前端 + API 分离 | 前端通过 REST/GraphQL API 间接访问数据库 |
| 实时数据同步 | 结合 WebSocket + 服务端中间层 |
| 多数据库兼容 | 使用 ORM(Prisma、TypeORM、Sequelize) |
总结
Node.js/Deno 等运行时环境下,JavaScript 可以直接访问 MySQL 和 MongoDB;但浏览器中的 JavaScript 绝对不可以。 这是由运行环境而非语言本身决定的。对于生产应用,始终建议通过后端服务层作为数据库的X_X,以确保安全性和可维护性。
云小栈