我有一个用例,我需要在谷歌云函数中使用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)
提前谢谢。
问题解决如下:
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)
在第二次检查中,似乎是Firebase Admin SDK for Node。js确实有FirebaseApp的概念。您可能想尝试传递admin。app()
进入GeofireX进行初始化。
<罢工> 在云函数中,您正在使用 Firebase Admin SDK for Node.js,它没有 FirebasApp
.
--也许这就是彻底的解决办法--
两个步骤:-
步骤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代码中打印日志 我的登录设置如下 我打印日志的代码 日志是