Облачные функции Firebase Typecript ReferenceError: Google не определен

У меня есть облачная функция, которая делает запрос к API карты Google, чтобы получить информацию о местоположении геокода с latlng. когда я делаю запрос, он показывает эту ошибку в журналах ReferenceError: google is not defined at /user_code/lib/file_name Я не знаю, в чем причина этого, и я добавил типизированный пакет в файл package.json.

package.json

{
  "name": "functions",
  "scripts": {
    "lint": "tslint --project tsconfig.json",
    "build": "tsc",
    "serve": "npm run build && firebase serve --only functions",
    "shell": "npm run build && firebase functions:shell",
    "start": "npm run shell",
    "deploy": "firebase deploy --only functions",
    "logs": "firebase functions:log"
  },
  "main": "lib/index.js",
  "dependencies": {
    "@google/maps": "^0.4.6",
    "@types/googlemaps": "^3.30.10",
    "firebase-admin": "^5.12.1",
    "firebase-functions": "^1.0.4",
    "nodemailer": "^4.6.4",
    "twilio": "^3.16.0"
  },
  "devDependencies": {
    "tslint": "^5.10.0",
    "typescript": "^2.9.2"
  },
  "private": true
}

Функция загрузки информации о местоположении

async function getAddressFromLatAndLang(location) {
  const maps = require('@google/maps')
  const googleMapsClient = maps.createClient({
    key: 'API_KEY',
    Promise: Promise
  });

  const latlng = new google.maps.LatLng(location.latitude, location.longitude)
  const result = await googleMapsClient.geocode({ latlng: latlng }).asPromise()
  console.info(result)
}

есть ли пакет google / maps npm? не могли бы вы направить меня к URL-адресу, чтобы проверить это?

Alex Mounir 23.06.2018 13:55

Да и я добавил это

Ahmed Abdelmeged 23.06.2018 13:56

тогда, возможно, вы могли бы попробовать определить константу карт выше функции getAddressFromLatAndLang в основном. Динамический импорт / требование может не поддерживаться.

Alex Mounir 23.06.2018 14:04

как этот const maps = google.maps?

Ahmed Abdelmeged 23.06.2018 14:09
const maps = require('@google/maps') выше в глобальной функции перед getAddressFromLatAndLang.
Alex Mounir 23.06.2018 14:11

Проблема не в этом, проблема в new google.maps.LatLng не может найти Google во время выполнения

Ahmed Abdelmeged 23.06.2018 14:12

Я понимаю, но вы пытаетесь потребовать модуль во время выполнения ... если проблема не в этом, дождитесь его правильной инициализации

Alex Mounir 23.06.2018 14:13

Хорошо, я добавил его как импорт в файл, и он работает, но у меня все еще есть ошибка Google !!

Ahmed Abdelmeged 23.06.2018 14:23

дама ошибка? как ты узнал, что это сработало?

Alex Mounir 23.06.2018 14:27

Извините, я редактирую комментарий, проверьте его. Хорошо, я добавил его, как вы сказали const над функцией, и он работает, но у меня все еще есть ошибка Google !!

Ahmed Abdelmeged 23.06.2018 14:29

та же ошибка, что и раньше?

Alex Mounir 23.06.2018 14:34

Да, я получаю ту же ошибку во время выполнения. проблема с @ types / googlemaps, но я не мог знать, что не так

Ahmed Abdelmeged 23.06.2018 14:35
Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Мне нравится библиотека Mantine Component , но заставить ее работать без проблем с Remix бывает непросто.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
TypeScript против JavaScript
TypeScript против JavaScript
TypeScript vs JavaScript - в чем различия и какой из них выбрать?
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Не все нужно хранить на стороне сервера. Иногда все, что вам нужно, это постоянное хранилище на стороне клиента для хранения уникальных для клиента...
Что такое ленивая загрузка в Angular и как ее применять
Что такое ленивая загрузка в Angular и как ее применять
Ленивая загрузка - это техника, используемая в Angular для повышения производительности приложения путем загрузки модулей только тогда, когда они...
1
12
477
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы пытаетесь использовать Клиентская библиотека NodeJs для веб-сервисов Google Maps.

Обратите внимание, что объект google.maps.LatLng не определен в библиотеке NodeJs, этот объект определен в Google Maps JavaScript API v3, который вы можете использовать на стороне клиента. В клиентской библиотеке NodeJs согласно документации github вы можете использовать следующие объекты как пару LatLng

A latitude, longitude pair. The API methods accept either:

  • a two-item array of [latitude, longitude];
  • a comma-separated string;
  • an object with 'lat', 'lng' properties; or
  • an object with 'latitude', 'longitude' properties.

источник: https://googlemaps.github.io/google-maps-services-js/docs/LatLng.html

Поскольку location в вашей функции имеет свойства latitude и longitude, вы можете использовать его непосредственно в

 const result = await googleMapsClient.reverseGeocode({ latlng: location }).asPromise()

Обратите внимание, что для преобразования координат в адрес вы должны использовать метод reverseGeocode(). Метод geocode() служит для преобразования адресной строки в координаты.

Надеюсь, это поможет!

Спасибо за вашу помощь, которую я сделал, это пытается определить местоположение и решение для массива, но дает invalidValueError: unexpected property "latlng" at Object.validator, я не знаю, почему @xomen

Ahmed Abdelmeged 25.06.2018 18:22

Я также пробую строку с разделителем, покажите мне ту же ошибку

Ahmed Abdelmeged 25.06.2018 18:32

О, я этого не заметил, но вы должны использовать метод .reverseGeocode() для определения широты и долготы. Я обновил свой ответ. Пожалуйста, ознакомьтесь с этим методом в документации: googlemaps.github.io/google-maps-services-js/docs/…

xomena 25.06.2018 23:22

Но вот вопрос, почему новый google.map.LatLng не работает, и я добавил пакет типов?

Ahmed Abdelmeged 26.06.2018 11:17

Потому что google.map.LatLng не является частью включенного вами пакета. google.map.LatLng определен на стороне клиента Google Maps JavaScript API, но вы используете другую библиотеку NodeJs на стороне сервера, в которой нет этого класса.

xomena 26.06.2018 11:20

Я понимаю. в любом случае спасибо за вашу помощь, вы спасли мне день

Ahmed Abdelmeged 26.06.2018 11:23

Другие вопросы по теме