当前位置: 首页 > 知识库问答 >
问题:

如何在谷歌云功能中使用geofirex

隗嘉歆
2023-03-14

我有一个用例,我需要在谷歌云函数中使用Geofire x库。库的初始化函数需要FirebasApp实例。是否有可能在云函数中初始化它,以便使用Firebase管理员查询fi恢复数据库

我所尝试的...

功能

import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';
admin.initializeApp();
admin.firestore().settings({timestampsInSnapshots: true});


// Init GeoFireX
import * as firebase from 'firebase/app';
import * as geofirex from 'geofirex';
const geoFire = geofirex.init(firebase);

exports.geofenceUserNotifications = functions.https.onRequest((req, res) => {
  if(!req || !req.body || !req.body.length || !req.body[0].latitude || !req.body[0].longitude || !req.body[0].uid || !req.body[0].userFcmToken){
    // end function with 401 status
    res.status(401).send('Authentication required.');
  }

  const uid = req.body[0].uid;
  const userFcmToken = req.body[0].userFcmToken;
  const latitude = req.body[0].latitude;
  const longitude = req.body[0].longitude;
  const field = 'position';

  geoFire.collection('users').setPoint(uid, field, latitude, longitude).then(result => {
    res.end('User geoPoint updated!');
  }).catch( err => {
      console.log(err);
      res.end('error when update user geo point!');
  });

});

功能

{
  "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": {
    "firebase-admin": "~6.0.0",
    "firebase-functions": "^2.1.0",
    "moment": "^2.23.0",
    "firebase": "^5.10.1",
    "geofirex": "0.0.6",
    "rxjs": "^6.3.3",
    "rxjs-compat": "^6.5.1"
  },
  "devDependencies": {
    "tslint": "~5.8.0",
    "typescript": "~2.8.3"
  },
  "private": true
}

部署时没有错误,但当调用geofextUserNoti的函数我得到这个错误:

TypeError: app.firestore is not a function
    at new GeoFireCollectionRef (/user_code/node_modules/geofirex/dist/index.cjs.js:1465:24)
    at GeoFireClient.collection (/user_code/node_modules/geofirex/dist/index.cjs.js:1639:16)
    at exports.geofenceUserNotifications.functions.https.onRequest (/user_code/lib/index.js:2197:13)
    at cloudFunction (/user_code/node_modules/firebase-functions/lib/providers/https.js:57:9)
    at /var/tmp/worker/worker.js:783:7
    at /var/tmp/worker/worker.js:766:11
    at _combinedTickCallback (internal/process/next_tick.js:73:7)
    at process._tickDomainCallback (internal/process/next_tick.js:128:9)

提前谢谢。

共有3个答案

钱季
2023-03-14

问题解决如下:

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
admin.firestore().settings({timestampsInSnapshots: true});

// Init GeoFireX
const geofirex = require('geofirex');// <-- Use require Instead of import geofirex
import { get } from 'geofirex';
const geoFire = geofirex.init(admin); // <-- admin not admin.app()
exports.geofenceUserNotifications = functions.https.onRequest(async (req, res) => {

  //setPoint (id, field, lat, lng)
  geoFire.collection('users').setPoint(uid, field, latitude, longitude).then(result => {
    res.end('User geo point is updated!');
  }).catch( err => {
      res.end('error when update user geo point');
      return;
  });
});

geoFireX很好用。

但现在我面临geoFireX查询的另一个问题。我试图获取附近的物品,但geoFireX返回可见

我试图通过GeoFireX使用get():

const query = geoFire.collection('places', queryRef).within(center, radius, field);
const nearbyPlaces = await get(query); // await query.pipe(operators.first()).toPromise();

但不幸的是,它不起作用。我得到了以下错误:

错误:参数onNext不是一个有效的函数.在Validator.(匿名函数). value[as isFunction](/srv/node_modules/@google-Cloud/fi还原/build/src/validate.js:99: 27)在Query.on快照(/srv/node_modules/@google-Cloud/fi还原/build/src/reference.js:1524: 25)在可观测。_subscribe(/srv/node_modules/Geofire x/dist/index.cjs.js:1597: 33)在可观测。_trySubscribe(/srv/node_modules/rxjs/内部/Observable.js:44: 25)在Observable.subscribe(/srv/node_modules/rxjs/内部/Observable.js:30: 22)在MapOperator.call(/srv/node_modules/rxjs/内部/运营商/map.js:32: 23)在Observable.subscribe(/srv/node_modules/rxjs/内部/Observable.js:25: 31)在Object.subscribeToResult(/srv/node_modules/rxjs/internal/util/subscribeToResult.js:12: 23)。_complete(/srv/node_modules/rxjs/内部/可观察/组合atest.js:76: 46)。Subscriber.complete(/srv/node_modules/rxjs/内部/Subscriber.js:78: 18)

秦浩漫
2023-03-14

在第二次检查中,似乎是Firebase Admin SDK for Node。js确实有FirebaseApp的概念。您可能想尝试传递admin。app()进入GeofireX进行初始化。

<罢工> 在云函数中,您正在使用 Firebase Admin SDK for Node.js,它没有 FirebasApp.

郭俊人
2023-03-14

--也许这就是彻底的解决办法--

两个步骤:-

  1. 将地理点和地理哈希添加到firestore中
  2. 使用地质点数据进行查询

步骤1解决方案:为此,您必须添加Firebase-admin sdk,并使用geofirex.init(admin)配置Geofire x。Ex:

const geofirex = require('geofirex');// <-- Use require Instead of import geofirex
import { get } from 'geofirex';
const geo = geofirex.init(admin); // <-- admin not admin.app()

现在,您可以像这样存储您的地理点和地理哈希:-

const point = geo.point(40.1, -119.1);

使用firestore将其存储到数据库中。

步骤2解决方案:为此,您必须使用Firebase web sdk来配置Geofire x。否则,您将无法从您的fi还原数据库进行查询!Ex:

import * as firebase from 'firebase';
var firebaseConfig = {
    apiKey: API_KEY_HERE,
    authDomain: DOMAIN_HERE,
    databaseURL: FIREBASE_REALTIME_DATABASE_URL,
    projectId: PROJECT_ID,
    storageBucket: STORAGE_BUCKET,
    messagingSenderId: MESSAGING_SENDER_ID,
    appId: FIREBASE_APP_ID,
    measurementId: MEASUREMENT_ID
  };
firebase.initializeApp(firebaseConfig);

import geofirex = require('geofirex');// <-- Now, use import Instead of require('geofirex')
const geo = geofirex.init(firebase.app()); // <-- firebase or, firebase.app()

您可以从firebase控制台web sdk安装程序获取firebaseConfig。复制并粘贴即可!;)现在,您可以像这样查询firestore地质点:-

router.get('/expert', (req, res, next) => {
    const radius = req.query.radius
    const lat = req.query.lat
    const lng = req.query.lng
    const field = 'position'

    geo.collection('ex-pending').within(geo.point(lat, lng), radius, field).subscribe(snap => {
        res.status(200).send(snap)
    })

})

就是它!: D

 类似资料:
  • 我有一个应用引擎项目。 我也有谷歌云功能。 我想从App Engine项目中调用谷歌云功能。我就是没法让它发挥作用。 是的,如果我将函数完全公开(即将云函数设置为“允许所有流量”,并为“所有用户”创建一个允许调用函数的规则),它就可以工作。但是如果我限制这两个设置中的任何一个,它会立即停止工作,我得到403。 应用程序和函数在同一个项目中,所以我至少假设将函数设置为“仅允许内部流量”应该可以正常工

  • 谷歌云的功能似乎非常有趣,因为它是无服务器和零维护的解决方案。但是,什么时候在谷歌应用程序引擎上使用谷歌云功能合适呢?

  • 刚刚完成Hello World谷歌云功能教程,收到以下响应头:

  • 我想能够从谷歌云功能中调用谷歌应用程序引擎,有可能吗?找不到任何解决办法

  • 我正在Firebase中的一个项目中工作,该项目使用图形魔法将图像转换为PDF,在本地模拟器中工作正常,但在生产中没有 错误:无法执行GraphicsMagick/ImageMagick:gm“convert”。/0”。/a4.pdf“这很可能意味着在ChildProcess中找不到gm/convert二进制文件。(/workspace/node_modules/gm/lib/command.js

  • 我使用logback在java的Google Cloud函数中打印日志。我想打印日文日志,但日志都是奇怪的字符。如何在Java代码中打印日志 我的登录设置如下 我打印日志的代码 日志是