typescript - 如何在谷歌云功能中使用 geofirex
问题描述
我有一个用例,我需要在 Google Cloud Functions中使用geofirex库。库的 init 函数需要 FirebaseApp 实例。是否可以在云函数中对其进行初始化,以便使用 firebase-admin 查询 firestore 数据库?
我试过的..
函数 > src > index.ts
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!');
});
});
功能 > 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": {
"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
}
部署时没有错误,但是当调用 geofenceUserNotifications 函数时出现此错误:
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)
提前致谢。
解决方案
-- 也许这就是完整的解决方案 --
两个步骤:-
- 将 Geopoint 和 Geohashes 添加到 Firestore
- 使用地理点数据查询
第 1 步解决方案: 为此,您必须添加 firebase-admin sdk 并使用 geofirex.init(admin) 配置 geofirex。前任:
const geofirex = require('geofirex');// <-- Use require Instead of import geofirex
import { get } from 'geofirex';
const geo = geofirex.init(admin); // <-- admin not admin.app()
现在您可以像这样存储您的 Geopoint 和 Geohashes:-
const point = geo.point(40.1, -119.1);
使用 firestore 将其存储到数据库中。
第 2 步解决方案: 为此,您必须使用 firebase web sdk 来配置 geofirex。否则,您将无法从您的 Firestore 数据库中查询!前任:
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
推荐阅读
- css - 等效于 fr(分数)单位的 Flexbox
- spartacus-storefront - 在 Spartacus 中为新 API 创建 API 调用
- python - 如何在 Python 中为 R 代码编写包装器
- reactjs - React-admin:在侦听器事件上更新列表
- typescript - 删除 Bull 中的可重复作业
- spring - Spring Bean 属性的操作
- mongodb - 无法使用 GCP 集群中的 VPC 对等连接到 Mongo Atlas
- javascript - 按键事件未触发
- lua - 我必须导入任何东西才能在 lua 中使用 drawPoint() 吗?
- flutter - 如何为我的 BottomNavigationBarItem 元素设置边框?