目录

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)
        }
      })
    })
  },
}

更多推荐