云函数中使用“request-promise”调用腾讯地图实现地址解析(地址转坐标)报400错误?
发布于 6 年前 作者 lidu 12559 次浏览 来自 官方Issues

业务逻辑如下:

1 云函数A获取客户名称列表;

2 云函数B通过调用腾讯地图WebService API实现地址解析(地址转坐标),试图实现输入“客户名称”,返回客户名称所在地的经纬度坐标(X,Y)。

https://lbs.qq.com/webservice_v1/guide-geocoder.html

// 云函数入口文件
const cloud = require('wx-server-sdk')
//const request = require('request')
const rp = require('request-promise')
//const soap = require('soap')
 
cloud.init()
 
// 云函数入口函数
exports.main = async (event, context) => {
  const wxContext = cloud.getWXContext()
 
  var latitudeAndLongitude = null
 
  //request.get()
  var options = {
    uri: 'https://apis.map.qq.com/ws/geocoder/v1/?address=' + event.address + '&key=' + event.developerKey,
    method: 'GET',
    json: true
  }
  latitudeAndLongitude = await rp(options).then(function (res) {
    return res
  }).catch(function (err) {
    return err
  })
 
  return {
    event,
    openid: wxContext.OPENID,
    appid: wxContext.APPID,
    unionid: wxContext.UNIONID,
    latitudeAndLongitude: latitudeAndLongitude
  }
}

报错情况:

  1. {errMsg: "cloud.callFunction:ok", result: {…}, requestID: "0478cfec-04f8-11ea-8883-52540025df0e"}

    1. errMsg"cloud.callFunction:ok"

    2. requestID"0478cfec-04f8-11ea-8883-52540025df0e"

    3. result:

      1. appid"wx7e6c11974fbb3699"

      2. event{address"攀枝花市正源科技"developerKey"开发者KEY"userInfo{…}}

      3. latitudeAndLongitude:

        1. error"<html> ↵<head><title>400 Bad Request</title></head> ↵<body bgcolor="white"> ↵<center><h1>400 Bad Request</h1></center> ↵<hr><center>nginx</center> ↵</body> ↵</html> ↵"

        2. message"400 - "<html>\r\n<head><title>400 Bad Request</title></head>\r\n<body bgcolor=\"white\">\r\n<center><h1>400 Bad Request</h1></center>\r\n<hr><center>nginx</center>\r\n</body>\r\n</html>\r\n""

        3. name"StatusCodeError"

        4. options{uri"https://apis.map.qq.com/ws/geocoder/v1/?address=攀枝花市正源科技&key=开发者KEY"method"GET"jsontruesimpletrueresolveWithFullResponsefalse, …}

        5. response:

          1. body"<html> ↵<head><title>400 Bad Request</title></head> ↵<body bgcolor="white"> ↵<center><h1>400 Bad Request</h1></center> ↵<hr><center>nginx</center> ↵</body> ↵</html> ↵"

          2. headers{server"nginx"date"Tue, 12 Nov 2019 02:56:26 GMT"content-type"text/html"content-length"166"connection"close"}

          3. request:

            1. headers{accept"application/json"}

            2. method"GET"

            3. uri{protocol"https:"slashestrueauthnullhost"apis.map.qq.com"port443, …}

            4. __proto__Object

          4. statusCode400

          5. __proto__Object

        6. statusCode400

        7. __proto__Object

      4. openid"og87w0AnfR0K43LB2yTep3fAwl6A"

      5. __proto__Object

    4. __proto__Object

云函数B代码如下:

// 云函数入口文件

const cloud = require(‘wx-server-sdk’)

const rp = require(‘request-promise’)

//const soap = require(‘soap’)

cloud.init()

// 云函数入口函数

exports.main = async (event, context) => {

const wxContext = cloud.getWXContext()

var latitudeAndLongitude = null

//request.get()

var options = {

uri: https://apis.map.qq.com/ws/geocoder/v1/?address= + event.address + ‘&key=’ + event.developerKey,

method: ‘GET’,

json: true

}

latitudeAndLongitude = await rp(options).then(function (res) {

return res

}).catch(function (err) {

return err

})

return {

event,

openid: wxContext.OPENID,

appid: wxContext.APPID,

unionid: wxContext.UNIONID,

latitudeAndLongitude: latitudeAndLongitude

}

}

2 回复

此问题目前并未根本解决,只是采取了一种变通实现的方式实现:

1 调用云函数,获取“公司简称”列表;

2 本地处理此列表,将已有地理坐标信息的数据筛除;

3 本地通过腾讯地图的“qqmap-wx-jssdk”,循环列表,根据“公司名称”,查询对应的纬经度信息,并将成功查询到纬经度信息的“_id”、“lat”和“lng”装入列表中返回;

4 调用云函数,将含“_id”、“lat”和“lng”数据(原地理坐标为[0,0],后成功查询到纬经度信息的“公司名称”)的列表更新到云数据库companies数据集的对应记录。

1、建议先拼装URI后,LOG出来看结果;

2、如果URI字符串没问题,去在线测试看结果。

然后再来讨论你以上的代码问题。

回到顶部