uniapp配置云函数 和 使用云函数来连接 mysql2 数据库
目录uniapp配置云函数云函数配置完成了。。。。。。。。。。。。。云函数链接 mysql由于 浏览器不能使用 mysql 模块,所以只能使用 云函数来调用 mysql 的数据首先要明确一点,就是小程序云开发的云函数是基于node.js的,所以我们使用node.js的mysql2模块可以直接来链接并操作mysql数据库,所以我们现在要做的就是怎么样在云函数里使用mysql2模块,并且借助这个模块类
·
目录
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
}
});
小程序端通过云函数链接 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)
}
})
})
},
}
更多推荐
所有评论(0)