云函数调用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')
// 调用云函数的request
var request = require('request')
// 使用当前云环境
cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV })
// 云函数入口函数
exports.main = async (event, context) => {

return new Promise((resolve, reject) => {
//调用request
request({
url: '', //请求地址
headers: { //请求头
"content-type": "application/json",
"Authorization": ""
},
method: "GET", //GET或POST请求
json: true, //返回的body结果为json格式,默认是false,如果你要解析返回的数据,选择ture
}, 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')
// 调用云函数的request
var request = require('request')
// 使用当前云环境
cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV })
// 云函数入口函数
exports.main = async (event, context) => {

return new Promise((resolve, reject) => {
//调用request
request({
url: '', //请求地址
headers: { //请求头
"content-type": "application/json",
"Authorization": ""
},
method: "POST", //GET或POST请求
json: true, //返回的body结果为json格式
body: "", //POST请求,要加上请求体
}, 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')
// 调用云函数的request
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)
//调用天气API查询天气
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 * * * *" //每天早起7点55执行
}]
}

参考文章

云开发http请求的两种写法 | 微信开放社区 (qq.com)

request-promise post请求微信小程序云函数调用http - Ocean123123 - 博客园 (cnblogs.com)