uniapp配置云函数 和 使用云函数来连接 mysql2 数据库

目录

uniapp配置云函数

 uniapp 发送请求向 mysql

小程序端通过云函数链接 mysql 

mysql2 普通链接

mysql2 连接池(防 SQL 注入)


uniapp配置云函数

1.获取 环境id

 2.打开 uniapp 的 App.vue 

	export default {
		onLaunch: function() {
		  wx.cloud.init({
		    env: 'test-123',//云开发环境
		    traceUser: true,
		  })
		}
    }

3.打开 manifest.json -> 源码视图 ->将   "cloudfunctionRoot": "cloudfunctions/" 复制到小程序特有相关

 4.复制  cloudfunctions ->打开微信开发者工具  -> 创建 cloudfunctions  文件夹 -> 右击新建 node.js云函数 

 5.在云函数中使用 wx-server-sdk -> 右击使用终端

npm install --save wx-server-sdk@latest

 云函数配置完成了。。。。。。。。。。。。。

 uniapp 发送请求向 mysql

uni.request({
		url: 'http://localhost:3008/uniapp/getDishes', 
		success: (res) => {
			console.log(res)
			this.goods=res.data.data.response.res_data
			this.cate=res.data.data.response.res_cate
		}
	});

具体使用访问uniapp官网https://uniapp.dcloud.io/api/request/requesthttps://uniapp.dcloud.io/api/request/requesthttps://uniapp.dcloud.io/api/request/request

小程序端通过云函数链接 mysql 

由于 浏览器不能使用 mysql 模块,所以只能使用 云函数来调用 mysql 的数据

首先要明确一点,就是小程序云开发的云函数是基于node.js的,所以我们使用node.js的mysql2模块可以直接来链接并操作mysql数据库,所以我们现在要做的就是怎么样在云函数里使用mysql2模块,并且借助这个模块类库来实现mysql数据库的链接

mysql2 普通链接

安装第三方包 npm install --save mysql2
const cloud = require('wx-server-sdk')
cloud.init({
  env: cloud.DYNAMIC_CURRENT_ENV,//云开发环境的初始化
})
const mysql = require('mysql2/promise');
exports.main = async (event, context) => {
  try {
    const connection = await mysql.createConnection({
      host: "你的外网ip地址", 
      user: "数据库的用户名",  
      password: "你的数据库密码", 
      database: "数据库名称",  
      port:"你的外网端口,默认3036就不用写",
    })
    const [rows, fields] = await connection.query(
      'SELECT version();',//query(sql语句)//这里sql语句是查看mysql版本
      );
    connection.end(function(err) {  //注意要断开连接,不然尽管获取到了数据,云函数还是会报超时错误
      console.log('断开连接')
   });
    console.log(rows)
    console.log(fields)
    return rows
  } catch (err) {
    console.log("连接错误", err)a
    return err
  }
}

封装

const mysql = require('mysql2/promise');

let config = {
 host: "",
 user: "",
 password: "",
 database: "",
 port: "3306",
}
//数据库操作内容
module.exports = {

 //需要arr, 这种方式会防止 sql注入攻击
 arrSqlConnect: (sql, arr) => {
  return new Promise(async (resolve, reject) => {
   try {
    let connection = await mysql.createConnection(config)
    let [rows, fields] = await connection.query(sql, arr);
    connection.end(function (err) { //注意要断开连接,不然尽管获取到了数据,云函数还是会报超时错误
     reject('断开连接' + err)
    });
    resolve({
     rows,
     fields
    })
   } catch (err) {
    reject(err)
   }
  })
 },
 //无需 arr 注意!这种方式会被  sql注入攻击
 sySqlConnect:(sql) => {
  return new Promise(async (resolve, reject) => {
   try {
    let connection = await mysql.createConnection(config)
    let [rows, fields] = await connection.query(sql);
    connection.end(function (err) { //注意要断开连接,不然尽管获取到了数据,云函数还是会报超时错误
     reject('断开连接' + err)
    });
    resolve({
     rows,
     fields
    })
   } catch (err) {
    reject(err)
   }
  })
 }
}

调用

const cloud = require('wx-server-sdk')
const {arrSqlConnect,sySqlConnect} = require('./dbconfig/dbconfig')
cloud.init({
  env:'',//云开发环境的初始化
})
exports.main = async (event, context) => {
  try {
 let sql='select * from transaction_info'
 let result =await sySqlConnect(sql)
 return result
  } catch (err) {
    return err
  }
}

mysql2 连接池(防 SQL 注入)

为什么使用连接池? 试想下如果用普通链接的时候 同时要10个请求,那么就会造成堵塞

const mysql = require("mysql2")

module.exports = {
  config: {
    host: "",
    port: "",
    user: "",
    password: "",
    database: "",
    //这里表示最多有 10 个链接池,也就是说最多能 10个请求 同时进行
    connectionLimit: 10,
  },
  //不使用占位符
  sySqlConnect: function (sql) {
    return new Promise((resolve, reject) => {
      //创建池
      let pool = mysql.createPool(this.config)

      //使用连接池
      /**
       *execute 会使用空闲的连接池来执行 sql 语句

        实测 execute 不防止 sql 注入攻击!!
        防止 sql 注入的方法 : 
         1-使用模板字符串 '${value}' 将输入内容转义成字符串
          let sql = `select * from business_acc where account='${account}' and password='${password}'`
          let result = await dbconfig.sySqlConnect(sql)
         2-使用占位符
          let sql = `select * from business_acc where account=? and password=?`
          let sqlArr = [account, password]
          let result = await dbconfig.arrSqlConnect(sql,sqlArr)
     */
      pool.execute(sql, (err, data) => {
        if (err) {
          reject(err)
        } else {
          resolve(data)
        }
      })
    })
  },
  //使用占位符
  arrSqlConnect: function (sql, arr) {
    return new Promise((resolve, reject) => {
      //创建池
      let pool = mysql.createPool(this.config)
      //使用连接池
      //execute 会使用空闲的连接池来执行 sql 语句
      pool.execute(sql, arr, (err, data) => {
        if (err) {
          reject(err)
        } else {
          resolve(data)
        }
      })
    })
  },
}

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用Uniapp连接数据库的方法可以通过Uniapp提供的开发能力来实现。具体的操作步骤可以参考Uniapp官方文档中关于数据库的操作方法。 Uniapp数据库功能为开发者提供了便利的数据存储和更新机制。开发者可以通过链接数据库和传参取值的方法来更加高效地操作数据,实现各种应用的需求。 在页面中连接函数的代码可以使用uniCloud.callFunction方法,示例如下: uniCloud.callFunction({ name: "cloudDemo01", //函数名 data: {} //传递的数据 }).then(res => { this.userArr = res.result.data; //将返回的数据赋值给变量 }) 这样就可以连接数据库并通过函数来获取数据了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Uniapp使用数据库的传参与取值详解](https://blog.csdn.net/qq_64121071/article/details/131434082)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [uni-app:web端和数据库关联(通过函数)](https://blog.csdn.net/m0_55700773/article/details/128794524)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值