微信小程序通过 node 连接 mysql——方法,简要原理,及一些常见问题

本文记录了使用Node.js作为中介,让微信小程序连接阿里云MySQL数据库的过程,包括下载Node.js,创建数据库,设置服务器,编写server.js代码,处理GET请求,以及解决可能出现的连接问题和小程序ERRTIMEOUT错误。同时,提供了排查数据库连接和小程序网络错误的建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

博主自己在22年夏天根据课程要求做了一个小程序连接阿里云服务器的案例,在最近又碰到了相应的需求。

原参考文章:微信小程序 Node连接本地MYSQL_微信小程序nodejs连接数据库_JJJenny0607的博客-CSDN博客 ,还请多多支持原作者!

第二次尝试的时候已经熟练许多了,但是还是遇到了很多挺烦人的问题,也浪费了很多时间排查 bug。因此博主打算趁着刚做过记忆还深刻的时候,把全过程、博主自己的理解和遇到的一些问题的解决方法整理出来。当然我也不可能能解决所有问题,遇到的部分问题也只是针对我自己的情况可以解决。因此如果 solutions 不起效或遇到其他问题,可以在评论区留言,我会与大家沟通(不保证能否解决~)。

原理

55ff06e4153087c9216fd7b56763ea7

nodejs 作为中介服务器,可以让小程序连接 mysql 数据库。

步骤

如果不出错误的话, 基本流程就是跟着上面的文章来的。

  1. 下载 node。可以在 cmd 中输入 node -v 查看有无成功下载。

    image-20230302134251274

  2. 新建一个数据库,这一部分很简单,有 mysql 相关基础的读者应该没问题,也可以看博主的 mysql 专栏学习。

  3. 新建一个小程序,在结构中新建 server 文件夹用于存储 node 本地服务器相关代码。

    image-20230302135701456

  4. 右键 server 文件夹,点击“在内建终端中打开”,安装一些所需的包。

npm init -y
npm i mysql --save-dev
npm install body-parser --save-dev
npm install express --save-dev
  1. 在文件夹下新建 server.js 文件,编写代码。
const express=require('express')
const bodyParser =require('body-parser')
const app=express()
const mysql = require('mysql')
const IPAddress='[你的数据库地址]'//因为这里是要链接远程数据库,ip 地址是 mysql 的地址!!本地就是 127.0.0.1,服务器上就自己找找看
const UserName='[mysql 用户名]'
const PWD='[mysql 密码]'
const DBName='[要操作的数据库名]'
app.use(express.json())
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({ extended: false }))
//这上面一段固定的,[] 的部分需要根据自己数据库的信息修改



//处理get请求。这里是一个 get 请求的方法演示,作用是查询 table1 表中的所有数据并返回。
app.get('/getUser',(req,res)=>{ //这里的是 get 方法 getUser,对应了刚才的页面发来的请求。就会执行这个方法。
  //参数传入是在 req.body 对象里面。比如上面的语句是获取传入的 openid 变量,并且我们新定义一个叫 openid 的变量存储传入的 openid 变量
  var connection=mysql.createConnection({
    host:IPAddress,
    port: 3306,		//端口号,mysql 固定3306
    user:UserName,
    password:PWD,
    database:DBName
  })//配置连接的属性
  connection.connect();//尝试连接
  connection.query("select * from table1",function(error,results,fields){//执行查找语句
    if(error) console.log(error);//执行失败的话
    res.json(results)
    console.log(results)
    
  })
  connection.end();//断开连接
  
})

app.listen(3000,()=>{//这是一个监听端口,会输出监听到的信息。上面的 console.log 就会在这里输出
  console.log('server running at http://'+IPAddress+':3000')
})

我们的 nodejs 是部署在本地的,就在 server 文件夹里。node_modules 是下载的 nodejs 包,server.js 是我们的操作 nodejs 的代码。

我们在需要调用数据库的页面里先调用本地服务器,比如在 mysqlTest.js 中,onLoad 里:

onLoad() {
    //我们写一个调用数据库函数,使得本页面加载时调用此函数,查找 youqi.data 里的所有条目。
        wx.request({
            method: 'GET',//这里要和 server.js 定义的 post or get 一致!!!
            url: 'http://[本地 IPV4 地址]:3000/getUser',//这里的 ip 地址不是数据库的地址,而是你的电脑本地的地址,因为这一步的操作是要找到本地 nodejs 服务器。getUser 要和 server.js 中定义的方法名一致。
            data: {
              //这里面是传入参数。比如我们要 select * from data where openid= 给定的 openid,就可以从这里传入
            },
            success: function (res) {//成功获取到值,返回一个 res 对象。如果不知道 res 对象里面包含什么,可以先输出 res 对象看一下其中都包含什么
              console.log(res);
            },
            fail: function () {//没有获取到值,说明这中间出问题了。
              console.log("获取失败");
            }
          })
    },

本地 IPV4 地址是怎么查出来的?打开 cmd,输入 ipconfig。无线局域网适配器 WLAN 里的 IPV4 即是。

nodejs 接收到了请求,就会执行 server.js 里对应的方法。

如何运行

首先 nodejs 服务器需要手动开启,我还不会自动开启。

右键 server 文件夹,在内建终端中打开,然后在终端中输入:

image-20230227001627448

下面那句话说明正常启动服务器并且开始监听。

我们输出一下 res,看看成功会返回什么信息。调试器里的 console 输出:

image-20230227000549916

data 里是我们数据库的查询结果。

image-20230227000639178

res.data 获取这个15长度的 Array。

image-20230227000715899

然后比如我们要获取其中的 time 值,就是 res.data[0].time, res.data[1].time… res.dat[14].time。

{} 表示其中是一个对象变量,通过句号+索引名称获取特定的值。

而刚才的一直在监听的内建终端里输出:

image-20230302140540514

这个的输出对应 function(error,results,fields) 里的 console.log(results)。如果查询失败,error 也是在这个内建终端里输出。

常见问题

数据库无法连接?

建好数据库后,最好就先用 cmd 或 workbench 连接一下试试。如果能成功连接并查询,之后出问题也可以排除 mysql 的一部分问题。

如果采用云服务器(如阿里云)连接不上,可能的问题有:

  • 服务器端口 80 和 3306 没开。(不建议一键全部放行,有被hacker get 的风险)
  • mysql 需要有一个用户能在所有 ip 地址里对该数据库进行读写操作,这里可以参考 DCL 的内容来新建符合要求的 user。Mysql_9 SQL 语句——DCL_sql语言dcl_灰海宽松的博客-CSDN博客
  • 服务器防火墙的问题,要开启3306端口。

image-20230302141204512

小程序报错 ERR TIMEOUT

打开网站可以看到 404 显示。

  • 首先先确保前面那个问题确实解决了,该数据库确实可以从本地连接,,不是数据库的问题。

  • 再确认 get post 方法是否对应,方法名是否写错。很多时候输入了错误的链接也会显示 404.

  • 小程序不校验合法域名是否打开。

  • 启用或关闭 windows 功能——Internet Information Services,及其可承载 web 核心,子项全部打开。点击确定。如果成功启动,在浏览器中输入 127.0.0.1,应该可以看到:

    image-20230302141638928

  • 检查方法名,get post 类别是否写错。

<think>好的,我现在需要帮助用户了解如何通过Node.js连接本地数据库以支持微信小程序。首先,我应该回顾用户提供的引用内容,看看有没有相关的步骤或者注意事项。引用1提到使用Node.js连接MySQL数据库时,8.0版本的加密方法不被支持,建议安装5.0版本。这可能是一个关键点,需要提醒用户注意MySQL的版本问题。 接下来,引用2和3提供了环境准备和具体的SQL语句示例,比如创建数据库和表。用户可能需要一个从安装到配置的完整流程。引用4讨论了用户登录时的数据处理,这可能涉及到数据库的查询和插入操作,可以作为应用实例的一部分。 我需要整理一个结构清晰的教程,分步骤说明环境准备、数据库设置、Node.js服务器搭建、连接数据库以及接口调用。每个步骤需要详细但简洁,确保用户能逐步操作。同时,要强调版本兼容性问题,避免用户遇到连接错误。 另外,用户可能关心如何在小程序端调用这些接口,所以需要包含前端代码示例,比如使用wx.request与后端通信。还要注意安全性,比如不直接在前端暴露数据库信息,而是通过后端处理。 最后,生成相关问题,帮助用户深入学习和解决可能遇到的问题,比如性能优化、数据同步等。需要确保回答准确,引用正确的来源,并在适当位置添加引用标识。</think>### 通过Node.js连接本地MySQL数据库支持微信小程序的教程 以下是分步骤的实现流程,结合环境配置、代码示例和注意事项: --- #### **1. 环境准备** - **MySQL安装**:安装MySQL 5.7或以下版本(避免8.0+的加密协议问题)[^1]。 - **Node.js安装**:建议使用LTS版本(如18.x)。 - **数据库工具**:Navicat或MySQL Workbench用于管理本地数据库。 - **微信开发者工具**:确保已配置合法域名(需在后台配置本地服务器IP或域名)。 --- #### **2. 创建本地数据库** 通过SQL命令创建数据库和表(示例:用户信息表): ```sql CREATE DATABASE wxapp_db; USE wxapp_db; CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, openid VARCHAR(255) UNIQUE NOT NULL, nickname VARCHAR(100), age INT ); ``` 引用自用户表设计案例[^3]。 --- #### **3. 搭建Node.js服务器** ##### **步骤1:初始化项目** ```bash mkdir node-mysql-server cd node-mysql-server npm init -y npm install express mysql body-parser cors ``` ##### **步骤2:编写服务端代码(app.js)** ```javascript const express = require('express'); const mysql = require('mysql'); const bodyParser = require('body-parser'); const cors = require('cors'); const app = express(); app.use(cors()); app.use(bodyParser.json()); // 创建MySQL连接池(避免频繁连接) const pool = mysql.createPool({ host: 'localhost', user: 'root', password: 'your_mysql_password', database: 'wxapp_db', connectionLimit: 10 }); // 示例接口:查询用户是否存在 app.post('/checkUser', (req, res) => { const { openid } = req.body; pool.query('SELECT * FROM users WHERE openid = ?', [openid], (error, results) => { if (error) throw error; res.json({ isExist: results.length > 0 }); }); }); // 启动服务器 app.listen(3000, () => { console.log('Node.js server running on port 3000'); }); ``` --- #### **4. 微信小程序调用接口** 在小程序端(如`app.js`或页面逻辑中)调用Node.js接口: ```javascript // 示例:检查用户是否为老用户 wx.login({ success(res) { if (res.code) { wx.request({ url: 'http://localhost:3000/checkUser', method: 'POST', data: { openid: '用户唯一标识' }, // 实际需通过code换取openid success: (resp) => { if (resp.data.isExist) { console.log('老用户直接登录'); } else { console.log('新用户需授权'); } } }); } } }); ``` 引用自用户登录逻辑实现[^4]。 --- #### **5. 关键注意事项** 1. **MySQL版本兼容性**:若使用MySQL 8.0+,需修改身份验证方式为`mysql_native_password`[^1]。 2. **安全处理**:避免在前端直接暴露数据库密码,需通过后端接口进行鉴权。 3. **跨域配置**:Node.js需启用CORS中间件,允许小程序域名访问[^2]。 4. **生产环境部署**:本地测试可用`localhost`,上线需将Node.js部署到云服务器并配置HTTPS。 ---
评论 114
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

灰海宽松

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值