Реагировать с собственными облачными функциями Firebase на Geofirestore - PullRequest
0 голосов
/ 03 июля 2019

Что я хочу сделать:

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

Требуется запросить местоположение у пожарного хранилища, чтобы отреагировать на собственный клиент с помощью облачных функций Firebase.

Я пробовал что-то похожее на стороне клиента, но при выполнении запроса с облачными функциями нужно иметь такие же результаты.

код клиента:

import firebase from 'react-native-firebase';

const lat = 45.78768768
const lng = -67.56457667
const httpsCallable = firebase.functions().httpsCallable('findLocations');
let collection = this.props.navigation.state.params.document; //collection name eg hotels
        const test = {
            db: collection.name,
            coordinates: {
                latitude: lat,
                longitude:lng
            }
        }

        httpsCallable({
             request: test })
            .then(({ data }) => {
                console.long(data);
                 this.setState({ data: data });
            })
            .catch((httpsError) => {
                console.log(httpsError.code); // invalid-argument
                console.log(httpsError.message); // Your error message goes here
            });

Облачная функция:

const admin = require('./node_modules/firebase-admin');
const firebase = require('./node_modules/firebase');
const { GeoCollectionReference, GeoFirestore, GeoQuery, GeoQuerySnapshot } = require('./node_modules/geofirestore');
const serviceAccount = require('./serviceAccount.json');

admin.initializeApp({
    credential: admin.credential.cert(serviceAccount),
    databaseURL: 'app-url',
});

const firestore = admin.firestore();
const geofirestore = new GeoFirestore(firestore);
const settings = { timestampsInSnapshots: true };
firestore.settings(settings);

exports.findLocations = functions.https.onCall((data) => {

    if (!data.request) {
        throw new functions.https.HttpsError(
            'invalid-argument', // code
            'Your error message goes here', // message
        );
    } else {
        let locations = [];
        const geocollection = geofirestore.collection(data.db);
        geocollection
            .limit(20)
            .near({
                center: new firebase.firestore.GeoPoint(data.latitude, data.longitude),
                radius: 100,
            })
            .get()
            .then((GeoQuerySnapshot) => {
                GeoQuerySnapshot.docs.forEach((doc) => {
                    return locations.push(doc.data());
                });
            })
            .catch(function(error) {
                console.log('Error getting documents: ', error);
            });
    }

    return { locations: locations };
});
...