uni-app无法直连MySQL/PostgreSQL,必须通过HTTP调用后端API或使用uniCloud云数据库(MongoDB);云函数需配置环境变量、启用本地调试,云数据库操作基于JSON查询语法且须配安全规则。

uni-app 不能直接连 MySQL/PostgreSQL 这类传统数据库
uni-app 是前端框架,运行在 WebView 或小程序环境里,没有服务端执行权限,mysql2、pg、sequelize 这些 Node.js 驱动根本跑不起来。所谓“连接数据库”,实际是走 HTTP 请求调用后端接口,或使用 uniCloud 提供的云函数 + 云数据库(MongoDB)方案。
常见错误现象:Cannot find module 'mysql'、ReferenceError: require is not defined、小程序真机报 request:fail net::ERR_CONNECTION_REFUSED——本质都是试图在前端发直连请求或引入服务端模块。
- 如果你已有现成的 Node.js/PHP/Java 后端,uni-app 只需用
uni.request调它的 API,别碰数据库驱动 - 如果想零后端起步,uniCloud 是唯一官方支持的“无服务器”路径,它内置的是 MongoDB(不是 MySQL),数据操作通过
uniCloud.callFunction或uniCloud.database完成 - uniCloud 的云数据库不支持 SQL 语法、JOIN、事务(跨集合)、外键约束,设计时得按文档里的「集合-文档」模型来组织数据
uniCloud 初始化失败:云服务空间没选对 or 本地调试没开
新建 uni-app 项目后点「开通 uniCloud」,很容易卡在「初始化失败」或控制台一直显示 uniCloud init failed。核心原因是:你没在 HBuilderX 里正确绑定云服务空间,或者没启用本地云函数调试代理。
- 必须用 HBuilderX(不是 VS Code)打开项目,右键根目录 →「uniCloud」→「创建服务空间」,选阿里云或腾讯云(微信小程序只认腾讯云,App/支付宝/H5 两者都可)
- 创建完立刻点「上传云端」,否则本地
uniCloud.callFunction会报function not found - 运行到模拟器或真机前,先点菜单栏「运行」→「运行到小程序模拟器」→ 勾选「启用 uniCloud 本地调试」,否则云函数调用会超时
- 云函数名不能含大写字母或短横线,比如
get-user-list会报错,得改成getUserList
云数据库增删改查写法和传统 SQL 差在哪
uniCloud 云数据库用的是类 MongoDB 的 JSON 查询语法,没有 SELECT * FROM users WHERE age > 18 这种写法,所有操作都基于 collection('users').where(...).get() 链式调用。
典型误区:把 SQL 的思维直接套过来,比如想「LEFT JOIN 订单表」,结果发现云数据库不支持 JOIN;或者用 .where({ status: 'paid' }) 查字符串,却忘了字段值其实是数字 1 —— 云数据库类型严格,1 和 "1" 不相等。
- 查询条件必须用
.where(),支持对象字面量({ name: '张三' })或db.command.eq等操作符(db.command.gt(18)) - 分页靠
.skip(0).limit(10),不是LIMIT 10 OFFSET 0;总数要单独调.count(),不能COUNT(*) - 更新单条用
.doc(id).update(),更新多条必须加.where().update(),且默认最多更新 100 条,超了得自己分批 - 安全规则(
database.rules.json)必须配,否则真机上get()返回空数组,但控制台没报错——这是最常被忽略的坑
云函数里怎么安全访问外部 API(比如微信登录、支付)
云函数是运行在 uniCloud 服务端的 Node.js 环境,可以 require('https') 或用 uniCloud.httpclient 发请求,但要注意:不能把敏感密钥(如 appSecret)写死在前端代码里,也不能在前端直接调用微信 code2Session 接口。
真实场景中,用户点击登录按钮,前端只传 code 给云函数,由云函数拿 code + appid + appSecret 去微信服务器换 openid,再存进云数据库。整个过程密钥只存在于云函数里,不会泄露。
- 密钥必须存在云函数的环境变量中(HBuilderX → 云函数右键 →「配置环境变量」),读取方式是
process.env.UNICLOUD_APPID - 不要在云函数里用
uni.request,要用uniCloud.httpclient.request或原生https.request,前者自动带 uniCloud 的 UA 和超时控制 - 微信支付回调地址必须填云函数 HTTP 触发器 URL(形如
https://xxx.service.tcloudbase.com/pay-callback),不能填本地地址或前端域名 - 云函数默认超时 10 秒,调第三方 API 超时要主动
try/catch并返回明确错误,否则前端uniCloud.callFunction会卡住或报timeout
云开发真正的复杂点不在语法,而在权限模型和部署节奏:安全规则写错,数据就不可见;环境变量漏配,云函数就拿不到密钥;本地调试开关一关,整个链路就断掉。这些地方没报错提示,只默默失败,得一个个去日志里翻。


















