地理编码客户端未向地理编码 api 发送请求

Zip*_*USA 2 javascript google-maps geocoding nodes firebase

我正在尝试使用google-maps-services javascript 库。我希望从街道地址获取(lat,lng)。出于测试目的,我正在运行一个可调度的 firebase 函数并从那里调用库函数。但是,只有我的错误路径被执行。以下是我正在使用的环境详细信息和代码片段

环境详情

  • 平台:Node.js v8 上的 firebase 云函数
  • 地理编码API版本:2.0.2

重现步骤

运行一个从地理编码 API 请求 (lat, lng) 的异步函数。函数体(在index.js内部)如下

async function getDriverLocationNearAddress(streetAddress){
const geocodingClient = new Client({});
let params = {
        address: streetAddress,
        components: 'country:US',
        key: API_KEY_GEOCODING
    }; 
    console.log('retrieving lat, lng for ' + streetAddress);
    return geocodingClient.geocode(params)
    .then((response)=>{
        console.log('status: ' + response.data.status);
        console.log(response.data.results[0].geometry.location.lat);
        console.log(response.data.results[0].geometry.location.lng);
        return response;
    })
    .catch((error)=>{
        console.log('error retrieving geocoded results');
    });
}
Run Code Online (Sandbox Code Playgroud)

已执行以下初始化

API_KEY_GEOCODING='*******************************'; // key not shown
const Client = require("@googlemaps/google-maps-services-js").Client;
Run Code Online (Sandbox Code Playgroud)

我每 1 分钟使用调度程序 API 定期运行此函数

exports.scheduledUpdateDriverLocations = functions.pubsub.schedule('every 1 minutes').onRun( (context) => {
    return getDriverLocationNearAddress('1042 Middlefield Rd, Redwood City, CA');
});
Run Code Online (Sandbox Code Playgroud)

控制台日志显示我getDriverLocationsNearAddress不断点击 catch 语句,而没有在中打印任何日志then部分打印任何日志。

在此输入图像描述

但是,如果我尝试使用浏览器访问地理编码 API,它正在工作。我的 google cloud api 控制台显示,除了使用浏览器发送的请求外,我没有收到任何 api 请求。在下图中,我只看到一个请求,尽管我在指定事件发生几分钟后每分钟发送一次请求。

在此输入图像描述

这是错误日志。我的请求似乎格式错误,但不确定为什么会这样

{ Error: Request failed with status code 400
    at createError (/srv/node_modules/axios/lib/core/createError.js:16:15)
    at settle (/srv/node_modules/axios/lib/core/settle.js:17:12)
    at IncomingMessage.handleStreamEnd (/srv/node_modules/axios/lib/adapters/http.js:236:11)
    at emitNone (events.js:111:20)
    at IncomingMessage.emit (events.js:208:7)
    at endReadableNT (_stream_readable.js:1064:12)
    at _combinedTickCallback (internal/process/next_tick.js:139:11)
    at process._tickDomainCallback (internal/process/next_tick.js:219:9)
  config: 
   { url: 'https://maps.googleapis.com/maps/api/geocode/json',
     method: 'get',
     headers: 
      { Accept: 'application/json, text/plain, */*',
        'User-Agent': 'google-maps-services-node-2.0.2' },
     transformRequest: [ [Function: transformRequest] ],
     transformResponse: [ [Function: transformResponse] ],
     paramsSerializer: [Function],
     timeout: 10000,
     adapter: [Function: httpAdapter],
     xsrfCookieName: 'XSRF-TOKEN',
     xsrfHeaderName: 'X-XSRF-TOKEN',
     maxContentLength: -1,
     validateStatus: [Function: validateStatus],
     httpsAgent: 
      HttpsAgent {
        domain: null,
        _events: [Object],
        _eventsCount: 1,
        _maxListeners: undefined,
        defaultPort: 443,
        protocol: 'https:',
        options: [Object],
        requests: {},
        sockets: {},
        freeSockets: [Object],
        keepAliveMsecs: 1000,
        keepAlive: true,
        maxSockets: Infinity,
        maxFreeSockets: 256,
        createSocketCount: 52,
        createSocketCountLastCheck: 0,
        createSocketErrorCount: 0,
        createSocketErrorCountLastCheck: 0,
        closeSocketCount: 51,
        closeSocketCountLastCheck: 0,
        errorSocketCount: 0,
        errorSocketCountLastCheck: 0,
        requestCount: 52,
        requestCountLastCheck: 0,
        timeoutSocketCount: 51,
        timeoutSocketCountLastCheck: 0,
        maxCachedSessions: 100,
        _sessionCache: [Object],
        [Symbol(agentkeepalive#currentId)]: 52 },
     address: '1044 Middlefield Rd, Redwood City, CA',
     components: 'country:US',
     key: '************************************',
     data: undefined },
  request: 
   ClientRequest {
     domain: 
      Domain {
        domain: null,
        _events: [Object],
        _eventsCount: 1,
        _maxListeners: undefined,
        members: [Array] },
     _events: 
      { socket: [Function],
        abort: [Function],
        aborted: [Function],
        error: [Function],
        timeout: [Array],
        prefinish: [Function: requestOnPrefinish] },
     _eventsCount: 6,
     _maxListeners: undefined,
     output: [],
     outputEncodings: [],
     outputCallbacks: [],
     outputSize: 0,
     writable: true,
     _last: true,
     upgrading: false,
     chunkedEncoding: false,
     shouldKeepAlive: true,
     useChunkedEncodingByDefault: false,
     sendDate: false,
     _removedConnection: false,
     _removedContLen: false,
     _removedTE: false,
     _contentLength: 0,
     _hasBody: true,
     _trailer: '',
     finished: true,
     _headerSent: true,
     socket: 
      TLSSocket {
        _tlsOptions: [Object],
        _secureEstablished: true,
        _securePending: false,
        _newSessionPending: false,
        _controlReleased: true,
        _SNICallback: null,
        servername: 'maps.googleapis.com',
        npnProtocol: false,
        alpnProtocol: false,
        authorized: true,
        authorizationError: null,
        encrypted: true,
        _events: [Object],
        _eventsCount: 9,
        connecting: false,
        _hadError: false,
        _handle: [Object],
        _parent: null,
        _host: 'maps.googleapis.com',
        _readableState: [Object],
        readable: true,
        domain: [Object],
        _maxListeners: undefined,
        _writableState: [Object],
        writable: true,
        allowHalfOpen: false,
        _bytesDispatched: 178,
        _sockname: null,
        _pendingData: null,
        _pendingEncoding: '',
        server: undefined,
        _server: null,
        ssl: [Object],
        _requestCert: true,
        _rejectUnauthorized: true,
        _idleTimeout: 15000,
        _idleNext: [Object],
        _idlePrev: [Object],
        _idleStart: 3119505,
        _destroyed: false,
        parser: null,
        _httpMessage: null,
        [Symbol(asyncId)]: -1,
        [Symbol(bytesRead)]: 0,
        [Symbol(asyncId)]: 4567,
        [Symbol(triggerAsyncId)]: 0,
        [Symbol(agentkeepalive#socketName)]: 'sock[51#maps.googleapis.com:443:::::::::]',
        [Symbol(agentkeepalive#socketRequestCount)]: 1,
        [Symbol(agentkeepalive#socketRequestFinishedCount)]: 1 },
     connection: 
      TLSSocket {
        _tlsOptions: [Object],
        _secureEstablished: true,
        _securePending: false,
        _newSessionPending: false,
        _controlReleased: true,
        _SNICallback: null,
        servername: 
Run Code Online (Sandbox Code Playgroud)

Zip*_*USA 6

从node.js 的 google-map-services 库运行关于海拔 API 的最小示例后,我发现问题与如何向函数提供参数有关geocode

我将node.js代码更改如下

之前:我没有提供字段名称params

async function getDriverLocationNearAddress(streetAddress){
const geocodingClient = new Client({});
let params = {
        address: streetAddress,
        components: 'country:US',
        key: API_KEY_GEOCODING
    }; 
    console.log('retrieving lat, lng for ' + streetAddress);
    return geocodingClient.geocode(params)
    .then((response)=>{
        console.log('status: ' + response.data.status);
        console.log(response.data.results[0].geometry.location.lat);
        console.log(response.data.results[0].geometry.location.lng);
        return response;
    })
    .catch((error)=>{
        console.log('error retrieving geocoded results');
    });
}
Run Code Online (Sandbox Code Playgroud)

后:

async function getDriverLocationNearAddress(streetAddress){
const geocodingClient = new Client({});
let params = {
        address: streetAddress,
        components: 'country:US',
        key: API_KEY_GEOCODING
    }; 

    console.log('retrieving lat, lng for ' + streetAddress);
    geocodingClient.geocode({
        params:params
    })
    .then((response)=>{
        console.log('status: ' + response.data.status);
        console.log(response.data.results[0].geometry.location.lat);
        console.log(response.data.results[0].geometry.location.lng);
        return response;
    })
    .catch((error)=>{
        console.log('error retrieving geocoded results');
    });
}
Run Code Online (Sandbox Code Playgroud)