如何快速新建路由
服务端 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/