unicloud云函数可通过mysql2驱动连接外部mysql,需配置环境变量、启用外网访问、设置连接池,并使用参数化查询防注入。

uniCloud云函数里怎么连外部MySQL
uniCloud本身不提供MySQL服务,但允许你在云函数里用Node.js驱动直连外部MySQL(比如阿里云RDS、腾讯云CDB或自建服务器)。关键不是“uni-app连MySQL”,而是“uniCloud云函数作为中间层去连”。mysql2 是当前最稳妥的选择(比 mysql 支持 Promise 和连接池更好),必须装在云函数目录下,不能装在前端项目根目录。
- 进入云函数文件夹(如
cloudfunctions/getUserList),在终端执行:npm install mysql2 --save - 云函数代码里不要写
require('mysql'),改用const mysql = require('mysql2/promise')(带/promise后缀才能用await) - 连接配置严禁硬编码账号密码——全部走云函数环境变量:
process.env.DB_HOST、process.env.DB_PASSWORD等,上传前在 HBuilderX 云函数右键 →「配置环境变量」填入 - 务必设置连接池(不是单次
createConnection),否则高并发时会报connect ETIMEDOUT或Too many connections
为什么真机调用总失败:超时 or Connection refused
错误信息如 request:fail net::ERR_CONNECTION_REFUSED 或云函数日志里出现 connect ECONNREFUSED,90%是网络通路没打通,不是代码写错。
- RDS白名单必须包含 uniCloud 云函数所在服务器的出口IP——不是你本地电脑IP。阿里云控制台查「云函数所在区域」对应的真实出口IP段(比如华东1区函数出口IP可能是
47.98.x.x/32),加到RDS白名单里;腾讯云同理查「云函数所在VPC的NAT网关出口IP」 - 云函数运行环境默认关闭外网出方向,需在 HBuilderX 中右键云函数 →「配置」→ 勾选「启用外网访问」(否则
mysql2根本发不出请求) - 本地调试时,
process.env.DB_HOST如果填了localhost,实际连的是你本机,不是RDS;调试阶段建议直接填RDS公网地址,并确保你本机能telnet rds-host 3306通
云函数调MySQL和直接调后端API有啥区别
本质一样,都是HTTP转发,但部署位置和运维责任不同:云函数方案把后端逻辑写进 uniCloud,省掉独立服务器;传统后端方案要自己买ECS、配Nginx、做负载均衡。
- 云函数适合中小流量、快速上线场景,但注意单次执行限时15秒(MySQL慢查询容易超时),且冷启动延迟明显
- 云函数里操作MySQL必须用
try/catch包裹,错误不能抛到前端——throw new Error('DB connect failed')会导致整个云函数失败,应统一返回{ code: 500, msg: '数据库异常' } - 不要在云函数里做 JOIN 或复杂事务,MySQL连接是短连接,每次调用新建+销毁;高频关联查询建议提前在RDS里建好视图,或用应用层拼装
- 如果已有现成后端(如 Express 接口),优先用
uni.request调它,别重复造轮子——uniCloud 连 MySQL 只应在「零后端起步」或「数据权限必须由云函数强管控」时选用
安全规则和性能容易被忽略的点
很多人以为只要连上就万事大吉,其实 RDS 密码泄露、SQL注入、连接数打满才是线上事故主因。
- 云函数环境变量里的数据库密码,一旦上传就无法撤回,务必用独立低权限账号(只给目标库
SELECT/INSERT/UPDATE,禁用DROP/DELETE和information_schema访问) - 所有用户输入必须用
mysql.escape()或参数化查询(connection.execute('SELECT * FROM user WHERE id = ?', [event.id])),拼接 SQL 字符串等于裸奔 - 连接池配置至少设
waitForConnections: true, connectionLimit: 10,否则并发稍高就排队失败;queueLimit: 0表示不限排队长度(慎用,可能OOM) - 云函数日志里如果频繁出现
connect EHOSTUNREACH,不是代码问题,是RDS实例规格太小(比如共享型S1),换独享型实例或升级配置











