微信小程序云开发httpApi调用

前言

微信小程序的开发愈发火热,微信官方推出的云开发功能给中小型开发者提供了很大助力??袅嗽瓶⒐δ艿男〕绦?,可以使用数据库,存储空间等一系列免费资源,给开发者提供了很大的便利,开发者可以聚焦核心功能,而不用分心部署自己并不熟悉的后端api服务。微信官方云开发文档对于小程序或者云函数中调用数据库的api解释的非常详细,但是对于非小程序或云函数环境(比如我们的node服务器)如何调用,就一笔带过,显得语焉不详。要注意,浏览器环境不能直接调用数据api,必须通过服务器中转。这里笔者将结合自己踩过的坑,展示一些特殊查询语句的调用方法。

准备工作

要在服务器环境中调用云开发的官方api,首先要根据你的小程序获取调用token:

const getAccessToken = async() => {
    const domain = 'https://api.weixin.qq.com/cgi-bin/token';
    return await ownTool.netModel.get(domain, {
        grant_type: 'client_credential',
        appid: '你的appId',
        secret: '你app的密码'
    });
}
//  返回的是一个对象,结构如下
//  { access_token, expires_in }
//  expriest_in表示还有多少时间这个token将过期,过期后要重新申请

ownTool.netModel就是任意具有http接口调用功能的第三方库, 这里使用get方法发起请求,请求参数中的appIdsecret都可以在小程序的开发者后台中产看。

image

这里获取的token是我们后续调用官方api的必要条件。

调用官方api

假设这里有如下格式的数据:

image

这里首先给出一个api调用的例子:

const queryApi = 'https://api.weixin.qq.com/tcb/databasequery?access_token=';
//  外围是笔者的业务代码,不用太在意
//  功能就是向官方api查询数据,再转给client,也就是服务器
app.post(apiPrefix + '/queryPeriod', async function(req,res){
    //  这里的token就是我们之前获取的token
    const wxToken = await getToken();
    const doamin = queryApi + wxToken;
    const { offset, size } = req.body;
    //  向微信官方api发起查询请求
    let a = await ownTool.netModel.post(doamin, {
        env: '你的环境id',
        query: 'db.collection("period").where({counselorId:"' + req.body.counselorId + '"}).' +
        'skip(' + offset +').limit(' + size + ').orderBy("date","desc").get()'
    })
    res.send(a);
});

这里的环境id就是你的小程序官方编辑器点击云开发摁钮,在云开发面板中查询的:

image

这里要注意,通过http api查询时,要把所有的查询语句转化成字符串的形式,最后把这个字符串作为请求参数传递给官方api。

通过http api调用官方接口的核心点和易错点就在这个query语句上,如果要表示字符串值,一定要用""或''对字段包裹,如果要让官方api理解为一个变量,则一定不能用""或''包裹。这里是绝大多数初学者在通过http调用api时翻车的原因

这里笔者的查询语句功能是:在period集合中,查找counselorId为某个特定值的数据,跳过一开始的offset个数据,该次请求最多返回size个,返回数据根据data字段进行降序排序后返回。如果在小程序中,查询语句类似这样:

db.collection('period').where({
  counselorId: '匹配的id'
}).skip(offset).limit(size)
.get({
  success: function(res) {
    console.log(res.data)
  }
})

如果功能在复杂一点,比如说我们要求date字段要在某个区间内的数据才返回,在小程序或云函数中我们的请求这样写:

const _ = db.command
db.collection('period').where({
  data: _.gt('2020-03-20').and(_.lt('2020-04-20'))
})
.get({
  success: function(res) {
    console.log(res.data)
  }
})

在自己的服务器中我们的查询字符串需要这样写:

let a = await ownTool.netModel.post(doamin, {
    env: '你的环境id',
    query: 'db.collection("period").where({date: _.gt("2020-03-20").and(_.lt("2020-04-20"))}).get()'
})

在官方解析我们的query时,会自动把_理解为db.command的实例,我们直接在query字符串中使用即可。在真实的项目中,我们用手写查询语句显得比较笨重,可以通过对查询对象直接JSON.stringfy()的方法将其转化为字符串拼接到query字符串中。这里笔者贴下自己在项目中的示例代码给大家参考,细节就不解释了,大家主要可以参考下将查询对象转化为string的操作:

function getQueryString(pageNum: number) {
    const queryJsonString = JSON.stringify(
        Object.assign(
        {},
        queryObj.switchOn
            ? {
                'formData.date': `_.gt('${queryObj.period?.[0]?.format('YYYY-MM-DD',
                )}').and(_.lt('${queryObj.period?.[1]?.format('YYYY-MM-DD')}'))`,
            } : {},
        queryObj.counselorId ? { counselorId: `'${queryObj.counselorId}'` } : {},
        ),
    )
    //  这里要替换下,否则后台会理解为字符串而不是查询条件
    .replace(/"/g, '')
    //  嵌套对象必须要套引号,否则无法解析
    .replace('formData.date', '"formData.date"');
    return `db.collection('interviewee').where(${queryJsonString}).skip(${(pageNum - 1) *
        SINGLE_PAGE_SIZE}).limit(${SINGLE_PAGE_SIZE}).orderBy('date','desc').get()`;
}

参考文献

微信小程序云开发http api调用官方文档

?著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,029评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,238评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事?!?“怎么了?”我有些...
    开封第一讲书人阅读 159,576评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,214评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,324评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,392评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,416评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,196评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,631评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,919评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,090评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,767评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,410评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,090评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,328评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,952评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,979评论 2 351

推荐阅读更多精彩内容