记小程序云函数中发送网络请求的连环踩坑

由于微信小程序的云函数的运行环境是 Node.js,所以可以在云函数中利用axios、request等库发送HTTP请求,以解决客户端中只能使用微信的wx.request API发送HTTPS请求的问题。

安装依赖的问题

在官方文档说得不太清楚的指引下,经过多次试验,得到以下结果:
1、每个需要使用第三方库的云函数都要单独安装依赖。
2、选择本地安装(没什么必要)时,首先用命令行在云函数的目录下运行“npm install --save库名”安装依赖,然后选择上传并部署所有文件。
3、选择云端安装依赖时,只需在package文件配置即可,无需使用npm安装依赖(官网文档却说要)。


使用axios库的问题

axios不能直接使用response赋值和打印response,否则会报错“Converting circular structure to JSON”,非要打印response查看时要用util.inspect()将其转为字符串,返回的数据用response.data取出。

const cloud = require('wx-server-sdk')
const axios = require('axios')
const util = require('util');
cloud.init()
exports.main = async (event, context) => {
  const wxContext = cloud.getWXContext()
  var responsedata
  await axios.get('http://wxapi.shinytengxvnyun.cn/weixinapi/getuser')
    .then(function (response) {
      // console.log(response);不能直接使用response赋值和打印response
      console.log(util.inspect(response));
      responsedata = response.data
    })
  return {
    openid: wxContext.OPENID,
    responsedata: responsedata
  }
}
使用request库的问题

request的异步操作使用await关键字无效(不知道为什么),要用Promise处理。

const request = require('request')
cloud.init()
exports.main = async (event, context) => {
  //使用await无效
  // await request.get('http://wxapi.shinytengxvnyun.cn/weixinapi/getuser',
  // function (error, response, body) {
  //   console.log(error); 
  //   console.log(response); 
  //   console.log(body); 
  // });
  return new Promise((resolve, reject) => {
    let url = 'http://wxapi.shinytengxvnyun.cn/weixinapi/getuser'
    request.get(url, function (err, resp, body) {
      return resolve(body)
    })
  })
}

未知本质的原理,先记录一下这几个坑。

你可能感兴趣的:(记小程序云函数中发送网络请求的连环踩坑)