烟消火灭网

前端直接连数据库?这事压根不成立。浏览器里跑的 JavaScript 没有权限打开 MySQL 或 PostgreSQL 的连接,也拿不到文件系统里的 SQLite。你能做的,是让 JS 发一个 HT

js如何获取数据库数据

前端直接连数据库?何获这事压根不成立。浏览器里跑的取数 JavaScript 没有权限打开 MySQL 或 PostgreSQL 的连接,也拿不到文件系统里的据库 SQLite。你能做的数据,是何获让 JS 发一个 HTTP 请求,由后端去查库,取数再把结果吐回来。据库所以“JS 获取数据库数据”这句话,数据准确说应该是何获“JS 通过接口拿数据”。

我见过不少新手卡在这里,取数以为引个 mysql2 包就能在浏览器里 require。据库Node.js 环境下确实可以,数据比如用 mysql2/promise 写个脚本:

const mysql = require('mysql2/promise'); async function main() {  const conn = await mysql.createConnection({  host: 'localhost',何获 user: 'root', password: '123456', database: 'test' }); const [rows] = await conn.execute('SELECT * FROM users WHERE id = ?', [1]); console.log(rows); await conn.end(); } main(); 

这段代码在 Node 里跑没问题,但放到浏览器里立刻报错。取数原因简单:浏览器沙箱不允许任意 TCP 连接,据库否则你访问的每个网页都能扫你内网数据库。这个安全边界是硬性的,绕不过去。

那前端到底怎么拿数据?走接口。假设后端用 Express 暴露一个 /api/users,前端用 fetch 就能取:

fetch('/api/users') .then(res => res.json()) .then(data => {  console.log(data); }); 

或者用 async/await 写得更顺眼:

async function loadUsers() {  const res = await fetch('/api/users'); if (!res.ok) throw new Error('请求失败'); return res.json(); } 

这里有个细节:fetch 不会因为 404 或 500 而 reject,只有网络层出错才 reject。所以你得自己检查 res.ok。我刚开始写的时候漏过这个,结果接口挂了页面还在那傻等。

接口背后,后端代码才是真正碰数据库的地方。比如 Node + Express + mysql2:

app.get('/api/users', async (req, res) => {  const [rows] = await pool.execute('SELECT id, name FROM users'); res.json(rows); }); 

注意这里用了连接池 pool,不是每次请求都新建连接。连接池复用 TCP 连接,省掉握手开销。我压测过一个小接口,用池比不用池 QPS 差了将近三倍。

如果你不想自己搭后端,Supabase 或 Firebase 这类 BaaS 提供了 JS SDK,前端直接调它们的 API 就能读写数据。比如 Supabase:

const {  data, error } = await supabase .from('users') .select('*'); 

看起来像在直接查库,其实还是走 HTTPS 接口,Supabase 在服务端帮你转了 SQL。安全规则靠 RLS(行级安全)控制,不配好策略,别人能把你表拖光。

还有一种情况:Electron 或 Tauri 桌面应用。渲染进程里的 JS 依然不能直接连库,但可以通过 IPC 调主进程,主进程用 Node 的 better-sqlite3 读本地文件。这种架构下 JS 拿数据的感觉很“直连”,实际还是隔了一层进程通信。

总结一下实际路径:浏览器 JS → HTTP 接口 → 后端服务 → 数据库驱动 → 数据库。少任何一环都跑不通。如果有人告诉你前端能直连 MySQL,要么他在说 Node 脚本,要么他在骗你。

访客,请您发表评论:

© 2026. sitemap