Клиент геокодирования не отправляет запросы в API геокодирования - PullRequest
0 голосов
/ 23 февраля 2020

Я пытаюсь использовать google-maps -услуги javascript библиотека из Node.js в Firebase Cloud Function. sh для получения (лат, lng) с адреса. Для тестирования я запускаю планируемую функцию firebase и оттуда вызываю библиотечные функции. Тем не менее, только мой путь ошибки выполняется. Ниже приведены сведения об окружении и фрагмент кода, который я использую

Сведения об окружении

  • Платформа: облачные функции firebase на Node.js v8
  • Версия API геокодирования: 2.0 .2

Шаги для воспроизведения

Запуск функции asyn c, которая запрашивает (lat, lng) из геокодирования api. Тело функции (внутри индекса. 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');
    });
}

Была выполнена следующая инициализация

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

Я периодически запускаю эту функцию, используя API планировщика каждые 1 мин.

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

Журналы консоли показывают, что мой getDriverLocationsNearAddress продолжает нажимать оператор catch без печати каких-либо журналов в разделе then.

введите описание изображения здесь

Однако, если я пытаюсь получить доступ к API геокодирования через браузер, он работает. Моя консоль API Google Cloud показывает, что я не получал 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: 

Ответы [ 2 ]

0 голосов
/ 11 марта 2020

После запуска минимального примера API повышения прав из библиотеки google-map-services для node.js я смог выяснить, что проблема связана с тем, как передать параметры в 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');
    });
}

После:

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');
    });
}
0 голосов
/ 26 февраля 2020

Возможно, я вижу, что вы не можете вызвать API с вашего веб-сервера (перекрестный запрос источника). Найдите имя вашего веб-сервера (например, localhost: 8080) и добавьте его в качестве авторизованного javascript источника. Информацию о точных шагах, которые необходимо выполнить, вы можете найти здесь .

Такое поведение обычно имеет место, когда вы можете получить доступ с помощью браузера, но вы не можете получить доступ к API изнутри ( javascript) код. Я бы также рекомендовал печатать точную ошибку вместо записи в лог или просто печатать обе из вашего блока catch. Как то так:

.catch((error)=>{
    console.log('Error retrieving geocoded results: ' + error);
});
...