wafer2的几个简单示例
如何快速新建路由
服务端 Demo 采用 Koa.js 框架编写,腾讯云基于 Koa 对上层进行一个简单的封装,方便你快速的添加新建路由
只需要在 controllers
目录下新建一个文件,例如为 demo.js
,写入如下代码:
module.exports = function (ctx, next) {
ctx.state.data = { msg: 'Hello World' }
}
保存之后,接着在 routes/index.js
的 module.exports = router
之前添加如下路由并保存:
router.get('/demo', controllers.demo)
接着点击右上角的“腾讯云”按钮,选择“上传测试代码”,勾选“智能上传”,点击确定即可上传并部署代码,等到提示开发环境部署成功了之后,打开浏览器,访问 https://腾讯云分配的域名/weapp/demo
,即可看到刚刚编写的返回,是一个 JSON 字符串:
{"code":0,"data":{"msg":"Hello World"}}
如何使用服务端 SDK 连接和操作数据库
服务端 SDK 还暴露出了内部使用的 MySQL 连接,由于 SDK 内部使用 Knex.js 连接数据库,SDK 暴露的 MySQL 实例就是 Knex.js 连接实例,具体使用方法可以查看 Knex.js 文档:
const { mysql } = qcloud mysql('db_name').select('*').where({ id: 1 }) // => { id:1, name: 'leo', age: 20 }
数据库增删改查
腾讯云SDK是用Knex操作MySQL的,它已经帮我们配置了一个knex的实例,包括在config.js里填写的用户名,密码等,所以这个实例可以引用出来直接用。因为腾讯云没给操作数据库的demo,所以我自己试了一下。
我的思路是:客户端post请求(包含了数据),经过服务端路由,然后用这个Knex实例操作数据库,最后返回结果。
服务端
添加路由
首先,在/server/routes/index.js中新添4行:
router.post('/mysql/insert', controllers.database.insertRecord); //增添
router.post('/mysql/delete', controllers.database.deleteRecord); //删除
router.post('/mysql/update', controllers.database.updateRecord); //更新
router.post('/mysql/select', controllers.database.selectRecord); //查询
添加增删改查函数
首先取得Knex实例的引用:
const { mysql } = require('../qcloud.js');
然后定义4个函数,分别对应增、删、改、查,并将它们导出。这些函数是异步函数,要使用async
/await
关键字,因为使用数据库是耗时操作。
const tableName = 'demo';
const keyField = 'myKey';
const valueField = 'myValue'; async function insertRecord(ctx) { ... }
async function deleteRecord(ctx) { ... }
async function updateRecord(ctx) { ... }
async function selectRecord(ctx) { ... } module.exports = {
insertRecord,
deleteRecord,
updateRecord,
selectRecord,
};
比如,function insertRecord(ctx)
是这么写的:
async function insertRecord(ctx) {
var obj = ctx.request.body;
// 查询是否键重复
await mysql(tableName)
.select()
.where(JSON.parse(`{"${keyField}":"${obj.key}"}`))
.then(async function(res) {
// 插入记录
if(!res.length) {
await mysql(tableName)
.insert(JSON.parse(`{"${keyField}":"${obj.key}","${valueField}":"${obj.value}"}`))
.then(function(res) {
ctx.state.data = {
code: 0,
message: "ok",
};
});
}
// 查询得知已有该键
else {
ctx.state.data = {
code: 1,
message: "key already exists",
}
}
})
}
这里核心是Knex的query builder,也就是用insert()
,delete()
,update()
,select()
,where()
等函数构造出完整的MySQL语句。这些链式调用返回JavaScript的Promise
,最后用.then(success, fail)
结尾,两个参数分别是Promise
被解决(resolve)或拒绝(reject)的回调函数。
Koa中间件支持async
/await
。所以最好用async
关键词,然后在数据库操作前写上await
。我试过,如果不写的话,会出现客户端收不到响应,
删、改和查也都是类似的。
客户端
setCloudStorage: function() {
var key = this.dbtest.keyInput1;
var data = this.dbtest.dataInput1;
var obj = {
key: key,
value: data,
};
qcloud.request({
url: `${config.service.host}/weapp/mysql/insert`,
method: "POST",
data: obj,
login: false,
success(result) {
console.log(result.data.data);
if(result.data.data.code == 0)
util.showSuccess('请求成功');
else
util.showModel('数据库操作失败', result.data.data.message);
},
fail(error) {
util.showModel('请求失败', error);
},
});
}
这个qcloud
是从SDK引出来的。qcloud.request()
是wx.request()
的一个封装,差不多的。主要是要设置好正确的URL,选择用POST还是GET方法,然后把数据塞进去,然后设置一下成功和失败之后的回调函数。
另外第11行的data
必须是个Object,字符串试了一下不行。
删、改和查也都是类似的。
参考链接:
1. https://blog.majinyu.xyz/index.php/weapp/operate-mysql-with-wafer2/
wafer2的几个简单示例的更多相关文章
- Linux下的C Socket编程 -- server端的简单示例
Linux下的C Socket编程(三) server端的简单示例 经过前面的client端的学习,我们已经知道了如何创建socket,所以接下来就是去绑定他到具体的一个端口上面去. 绑定socket ...
- C# 构建XML(简单示例)
C# 构建XML的简单示例: var pars = new Dictionary<string, string> { {"url","https://www. ...
- 根据juery CSS点击一个标签弹出一个遮罩层的简单示例
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...
- ACEXML解析XML文件——简单示例程序
掌握了ACMXML库解析XML文件的方法后,下面来实现一个比较完整的程序. 定义基本结构 xml文件格式如下 <?xml version="1.0"?> <roo ...
- demo工程的清单文件及activity中api代码简单示例
第一步注册一个账户,并创建一个应用.获取app ID与 app Key. 第二步下载sdk 第三步新建工程,修改清单文件,导入相关的sdk文件及调用相应的api搞定. 3.1 修改清单文件,主要是加入 ...
- spring-servlet.xml简单示例
spring-servlet.xml简单示例 某个项目中的spring-servlet.xml 记下来以后研究用 <!-- springMVC简单配置 --> <?xml versi ...
- SignalR 简单示例
一.什么是 SignalR ASP.NET SignalR is a library for ASP.NET developers that simplifies the process of add ...
- Web API 简单示例
一.RESTful和Web API Representational State Transfer (REST) is a software architecture style consisting ...
- XML引入多scheme文件约束简单示例
XML引入多scheme文件约束简单示例,用company.xsd和department.xsd来约束company.xml: company.xsd <?xml version="1 ...
随机推荐
- 让你的网页"抖起来"?!?
细心的小伙伴可能发现我的左下角有一个抖起来的小按钮,然后页面就开始皮了起来,哈哈好快乐啊 没有利用js,单独的使用了css3的动画就实现了这个效果 css设置 @keyframes shake-it{ ...
- networkx生成网络的子网计算
当我们用networkx生成网络时,节点之间的关系是随机的,很多时候我们生成的一个网络,存在不止一个子网,也就是说任意两个节点之间不一定连通 当我们想生成一个任意两点都能连通的网络时,就需要去判断生成 ...
- golang数据结构之选择排序
//SelectSort 选择排序 func SelectSort(arr *[]int) { ; i < len(arr); i++ { tmp := arr[i] index := i ; ...
- Java 程序员应在2019年学习的10条面向对象(OOP)设计原则
面向对象的设计原则 是 OOP 编程的核心,但是我看到大多数 Java 程序员都在追求诸如 Singleton 模式,Decorator 模式或 Observer 模式之类的设计模式,而对学习面向 ...
- 红黑树之 原理和算法详细介绍(阿里面试-treemap使用了红黑树) 红黑树的时间复杂度是O(lgn) 高度<=2log(n+1)1、X节点左旋-将X右边的子节点变成 父节点 2、X节点右旋-将X左边的子节点变成父节点
红黑树插入删除 具体参考:红黑树原理以及插入.删除算法 附图例说明 (阿里的高德一直追着问) 或者插入的情况参考:红黑树原理以及插入.删除算法 附图例说明 红黑树与AVL树 红黑树 的时间复杂度 ...
- File 删除给定的文件或目录
package seday03; import java.io.File; /*** 创建一个多级目录* @author xingsir*/public class MkDirsDemo { publ ...
- VUE基础实用技巧
Vue以前听说过,有了解过一点.当时还在热衷于原生JavaScript去写一些方法的封装,不是为啥,就感觉这样很帅,后面多多少少接触了一些JQuery的用法,到现在为止,JavaScript原生封装的 ...
- 何为http?何为RPC?
RPC(即Remote Procedure Call,远程过程调用)和HTTP(HyperText Transfer Protocol,超文本传输协议)他们最本质的区别,就是RPC主要工作在TCP协议 ...
- PHP mysqli_kill MySQLi 函数
mysqli_kill - 让服务器杀掉一个 MySQL 线程 语法:mysqli_kill ( mysqli $link , int $processid ) 本函数可以用来让服务器杀掉 proce ...
- ICMP重定向 Redirect netwox libpcap netwag
搭建环境 两台虚拟机. 攻击者:192.168.1.8 被攻击者:192.168.1.9 网络配置 主机均采用DHCP 如果没有路由器,可以使用NAT模式来做 攻击者配置 打开转发数据包功能 # su ...