云函数调用request请求
问题
上一篇微信小程序定时订阅消息问题文章里,选择了在本地使用setInterval()方法定时更新天气信息,但是要求用户打开小程序才能定时更新天气。做不到在发送消息之前查询当前的天气情况。所以出于这个问题,我选择了以下解决办法。
解决
在云函数里定义一个定时查询天气的函数,用户的位置信息提前存储在数据库里,查询天气时直接从数据库里查询位置信息(因为每次获取用户位置会要求用户授权,比较影响体验,所有就把上传用户授权位置信息提前存储在数据库)。
这里使用到了如何在云函数里调用request请求,微信开发官网文档没有找到关于这个的讲解。所以在这里简单记录一下,希望能对大家开发用帮助。下面的代码为在云函数里调用request请求例子
GET请求例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| const cloud = require('wx-server-sdk')
var request = require('request')
cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV })
exports.main = async (event, context) => { return new Promise((resolve, reject) => { request({ url: '', headers: { "content-type": "application/json", "Authorization": "" }, method: "GET", json: true, }, function (error, response, body) { console.info("HTTP - GET") console.info(body) if (response.statusCode === 200 && !error) { } }) }) }
|
POST请求例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| const cloud = require('wx-server-sdk')
var request = require('request')
cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV })
exports.main = async (event, context) => { return new Promise((resolve, reject) => { request({ url: '', headers: { "content-type": "application/json", "Authorization": "" }, method: "POST", json: true, body: "", }, function (error, response, body) { console.info("HTTP - POST") console.info(body) if (response.statusCode === 200 && !error) { } }) }) }
|
定时查询天气代码
index.js文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
| const cloud = require('wx-server-sdk')
var request = require('request')
cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV })
const db = cloud.database() const tableName = 'userInfo'
exports.main = async (event, context) => { try { const weather = await db .collection(tableName) .get() console.log("location:", weather.data);
for (const msgData of weather.data) { return new Promise((resolve, reject) => { var location = msgData.location console.log("location:", location) request({ url: 'https://jisutqybmf.market.alicloudapi.com/weather/query'+ "?location="+ location, headers: { "Authorization": "APPCODE 你自己的APPCODE" }, method: "GET", json: true, },function (error,response,body) { console.info("HTTP - GET") console.info(body) if (response.statusCode === 200 && !error && body.status == 0) { var result = body.result; console.info(result) var weatherMessage = "当前天气" + result.weather + "气温" + result.temp + "℃" + "详情点击查看" console.info("天气为:", weatherMessage) db.collection(tableName) .where({ openid: msgData.openid }) .update({ data: { weatherMessage: weatherMessage, } }) .then((res) => { console.log("定时添加天气信息到数据库成功", res); resolve(body) }) .catch((res) => { console.log("定时添加天气信息到数据库失败", res); reject() }); } } ) })
} } catch (e) { console.log(e) return e } }
|
config.json文件里边定义触发器(具体用法参考我的上一篇文章微信小程序定时订阅消息问题或官方文档)
1 2 3 4 5 6 7 8 9 10 11
| { "permissions": { "openapi": [ ] }, "triggers": [{ "name": "myTimer", "type": "timer", "config": "0 55 7 * * * *" }] }
|
参考文章
云开发http请求的两种写法 | 微信开放社区 (qq.com)
request-promise post请求微信小程序云函数调用http - Ocean123123 - 博客园 (cnblogs.com)