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

news2024/11/14 5:22:18

前言

博主自己在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 类别是否写错。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/382784.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue2 @hook 的解析与妙用

目录前言几种用法用法一 将放在多个生命周期的逻辑,统一到一个生命周期中用法二 监听子组件生命周期运行的情况运用场景场景一 许多时候,我们不得不在不同的生命周期中执行某些逻辑,并且这些逻辑会用到一些通用的变量,这些通用变量…

nginx日志服务之敏感信息脱敏

1. 创建实验资源 开始实验之前,您需要先创建实验相关资源。 日志服务之敏感信息脱敏与审计 2. 创建原始数据 本步骤将指导您如何创建NGINX模拟数据。 双击打开虚拟桌面的Firefox ESR浏览器。 在RAM用户登录框中单击下一步,并复制粘贴页面左上角的子…

使用groovy代码方式解开gradle配置文件神秘面纱

来到这里的是不是都有以下疑问: 1.build.gradle配置文件结构好复杂啊,怎么记? 2.内部是怎么进行分析和执行的? 3.为什么可以在配置文件里面写groovy代码,怎么识别的? 4.怎么才能很方便的记住和快速上手…

空口协议Eapol、802.11 Action、802.11 BAR 和 802.11BA、802.11 Encrypted Data讲解

如下报文 可以看到,除了有之前开放认证的报文之外,还多了 EAPOL 次握手的报文。另外,还有其他几种类型的报文:802.11 Action、802.11 BAR 和 802.11BA、802.11 Encrypted Data ​ 密匙认证协议EAPOL: EAP是Extensible Authentication Protocol的缩写,EAPOL就是(EAP…

Python搭建一个steam钓鱼网站,只要免费领游戏,一钓一个准

前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~! 我们日常上网的时候,总是会碰到一些盗号的网站,或者是别人发一些链接给你, 里面的内容是一些可以免费购物网站的优惠券、游戏官网上可以免费领取皮肤、打折的游戏。 这些盗号网站统一的目…

go版本分布式锁redsync使用教程

redsync使用教程前言redsync结构Pool结构Mutex结构acquire加锁操作release解锁操作redsync包的使用前言 在编程语言中锁可以理解为一个变量,该变量在同一时刻只能有一个线程拥有,以便保护共享数据在同一时刻只有一个线程去操作。对于高可用的分布式锁应…

6招优化WordPress打开速度-让你的网站飞起来

为什么我们的WordPress网站比你的快? 我们的官网是使用WordPress框架搭建的,有没有发现我们的网站非常快,而你的WordPress网站比较慢呢?那是因为我们的网站经过了优化。 WordPress 很慢? 为什么很多人都会觉得 Word…

【C语言进阶:指针的进阶】函数指针

本章重点内容: 字符指针指针数组数组指针数组传参和指针传参函数指针函数指针数组指向函数指针数组的指针回调函数指针和数组面试题的解析⚡函数指针 函数指针:指向函数的指针。 通过之前的学习我们知道数组指针中存放的是数组的地址,那么函…

如何在网络安全中使用人工智能并避免受困于此

人工智能在网络安全中的应用正在迅速增长,并对威胁检测、事件响应、欺诈检测和漏洞管理产生了重大影响。根据Juniper Research的一份报告,预计到2023年,使用人工智能进行欺诈检测和预防将为企业每年节省110亿美元。但是,如何将人工…

Sqoop 使用详解

Sqoop 概述Sqoop 是Apache 旗下的一款开源工具,用于Hadoop与关系型数据库之间传送数据,其核心功能有两个:导入数据和导出数据。导入数据是指将MySQL、Oracle等关系型数据库导入Hadoop的HDFS、Hive、HBase等数据存储系统;导出数据是…

web学习-Node.js入门学习

web学习-Node.js入门学习1.回顾与思考2. 初识Node.js2.1 Node.js的简介2.2Node.js的环境安装2.3. fs文件系统模块2.3.1 fs.readFile()2.3.2 fs.writeFile()2.3.3 练习-整理考试成绩2.3.4 fs模块-路径动态拼接的问题2.4 path路径模块2.5 http模块2.5.1 服务器相关的概念2.5.2 创…

移动app安全测试工具好物分享

移动互联网时代,我们的生活和工作深受移动app的影响。随着移动app的广泛应用,安全问题成为人们最关注的话题之一。移动app安全除了和软件开发密不可分之外,软件测试的作用也是不容忽视的。移动app安全测试是指测试人员利用各种测试手段验证Ap…

Java之注解

注解1.1 注解的概念1.2 内置注解1.3 元注解1.4 自定义注解1.1 注解的概念 Annotation 是从JDK5.0 开始引入的新技术 Annotation的作用: 不是程序本身,可以对程序做出解释(这一点和注释comment没什么区别)可以被其他程序&#xff…

解读场景化视频制作工具的实现过程

内容视频化正当其时,企业级智创工具创造新价值。全领域的内容视频化已是显性之势,其不仅覆盖传媒行业,更多泛行业正在以视频化内容的多元姿态创造新的商业价值。于是,不仅新闻传媒行业在超前体验智能化视频创造的效能红利&#xf…

ClickHouse进阶篇-多表连接物化视图

简介 在写这篇文章的时候doris 1.2 的物化视图只是支持单表建立物化视图,现在说下ClickHouse多表的物化视图。 前言 本文翻译自 Altinity 针对 ClickHouse 的系列技术文章。面向联机分析处理(OLAP)的开源分析引擎 ClickHouse,因…

蓝库云|ERP系统在企业数字化转型中最常用的八大功能

ERP系统和与企业数字化转型 随着数字化发展的兴起,规划和管理已成为企业产生富有成效的成果的关键。许多企业采用了企业资源规划 (ERP) 等先进工具,使企业所有者能够以高效的方式规划和管理其资源和运营。 ERP系统负责整合业务的不同流程并向决策者提供…

【LeetCode】剑指 Offer 20. 表示数值的字符串 p127 -- Java Version

题目链接:https://leetcode.cn/problems/biao-shi-shu-zhi-de-zi-fu-chuan-lcof/ 1. 题目介绍(20. 表示数值的字符串) 请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。 数值(按顺序&#xff…

【软件测试】还在背锅?接口自动化测试5个测试点(重要)8年测试的总结......

目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 功能测试 接口的功能…

什么是数据可视化,数据可视化有什么价值

“数据可视化”这个词看上去似乎让人有点摸不着头脑,但其实在实际生活中也有类似的应用。举个例子,媒婆给你介绍对象,前面给你铺垫一堆,如五官端正、身材修长、皮肤雪白(各种繁杂的信息描述),你…

Java集合(一)

目录 Java集合框架概述 Collection接口 Collection接口方法 Iterator迭代器接口 使用 Iterator 接口遍历集合元素 Iterator接口的方法 Iterator接口remove()方法 使用 foreach 循环遍历集合元素 Java集合框架概述 一方面, 面向对象语言对事物的体现都是以对…