Chrome运行代码报Net.createConnection is not a function错误如何解决
问题根因
Net.createConnection is not a function错误本质是架构选型错误,和browserify打包配置无关:
- npm上的
mysql包是Node.js环境专属驱动,依赖Node.js内置的net(TCP网络)、crypto等核心模块,这些模块是Node运行时自带的底层能力,浏览器安全沙箱根本没有对应实现。browserify只能转译CommonJS模块语法,不可能给浏览器补全TCP直连的系统级能力。 - 浏览器本身就禁止前端JS直接发起TCP连接访问任意数据库服务,就算你能polyfill相关API,把数据库账号密码、连接地址直接写在前端代码里,等于把数据库完全暴露给所有访问用户,任何人打开浏览器控制台就能拿到凭据删改数据,属于严重安全隐患,这种实现思路本身就不成立。
解决方案
- 立刻放弃浏览器直连MySQL的实现思路,调整为前后端分层架构:
- 数据库操作逻辑全部放在Node.js服务端实现:在服务端代码中引入
mysql包,完成连接创建、SQL执行等操作,数据库账号密码、连接配置只存在服务端,完全不对外暴露 - 浏览器端只负责通过HTTP/WebSocket等协议请求Node服务端暴露的接口,由服务端完成数据库交互后把结果返回给前端
- 数据库操作逻辑全部放在Node.js服务端实现:在服务端代码中引入
- 如果是本地测试场景不需要连接真实MySQL服务,可以换浏览器兼容的前端数据库类库,比如编译为WebAssembly的sql.js,在浏览器内存中运行SQLite实例,不需要发起网络连接。
代码修正示例
你原来写的直连数据库代码属于服务端逻辑,不能打包到浏览器运行,分层后的参考代码如下:
服务端代码(Node环境直接运行,不要用browserify打包)
const express = require('express'); const mysql = require('mysql'); const app = express(); // 数据库配置仅保存在服务端 const dbConnection = mysql.createConnection({ host: "localhost", user: "root", password: "", database: "你的业务数据库名" }); dbConnection.connect((err) => { if (err) { console.error("数据库连接失败", err); return; } console.log("数据库连接成功"); }); // 给前端提供查询接口 app.get('/api/user/list', (req, res) => { dbConnection.query('SELECT * FROM user', (err, result) => { if (err) { res.status(500).send({ msg: "查询失败" }); return; } res.send(result); }); }); app.listen(3000, () => { console.log("后端服务运行在 http://localhost:3000"); });
浏览器端代码(可使用browserify打包后运行)
// 前端只请求后端接口,不直接操作数据库 fetch('http://localhost:3000/api/user/list') .then(res => res.json()) .then(userList => { console.log("获取到用户列表", userList); });
内容的提问来源于stack exchange,提问作者user19340185
相关产品推荐
相关产品推荐

