Вызов внешнего API с помощью Cloud Function и создание документа - PullRequest
0 голосов
/ 31 марта 2020

Я пытаюсь создать некоторые облачные функции для:

  1. вызова Google Directions API с помощью Ax ios
  2. создания документа в Firestore на основе результата API
  3. Верните ссылку на документ в мое приложение iOS. (Я работаю по плану Blaze, платите как вы go)

У меня проблемы с созданием следующих функций, так как мои знания по Node / JS очень просты c. Может кто-нибудь, пожалуйста, быстро взгляните и дайте мне знать, что мне не хватает?

Obs .: Код разворачивается в firebase без предупреждений и ошибок. Я почти уверен, что проблема в том, что я пытаюсь вернуть свои обратные вызовы.

Заранее спасибо

РЕДАКТИРОВАТЬ

I Я сделал несколько изменений в коде, но я все еще получаю ноль в моем iOS приложении. Код все еще не создает документ в firestore.

const functions = require('firebase-functions');
const axios = require('axios');
var admin = require("firebase-admin");
admin.initializeApp();


// Func called by iOS App, If user is auth, call google maps api and use response to create a document at firestore
exports.getDistanceAndSavePackage = functions.https.onCall((data, context) => {
  if (!context.auth){ return {status: 'error', code: 401, message: 'Not signed in'} }
  const userId = context.auth.uid;
  const startCoordinates = data.startCoords;
  const endCoordinates = data.endCoords;

  const pkgDocReference = getGoogleRoute(startCoordinates, endCoordinates, res => {  
    console.log('google cloud function has returned');
    let venueId = userId;
    let distance = res.distance.value;
    let resultStartAdd = res.start_address;
    let resultEndAdd = res.end_address;

    const pkgDocRef = createTempPackage(venueId, distance, resultStartAdd, resultEndAdd, resultPkg => {
      return resultPkg
    })
    return pkgDocRef;
  })
  return pkgDocReference;
});



//Create Package Document
function createTempPackage(venueId, distance, startingAddress, endingAddress, callback){
  console.log('Creating temp package');
  const docRef = admin.firestore().doc(`/temp_packages/`)
  docRef.set({ 
    id: docRef.id,
    venue_id: venueId,
    distance: distance,
    starting_address: startingAddress,
    ending_address: endingAddress,
    timestamp: admin.database.ServerValue.TIMESTAMP,
    status: 0
  })
  .then(docRef => {
    console.log('Doc created')
    return callback(docRef);
  }).catch(error => {
    console.log('Error trying to create document')
    return callback(error);
  })
}


  //Call Google directions API
  function getGoogleRoute(startCoords, endCoords, callback){
    axios({
      method: 'GET',
      url: 'https://maps.googleapis.com/maps/api/directions/json',
      params: {
          origin: startCoords,
          destination: endCoords,
          key: 'mykey'
      },
    })
      .then(response => {
          let legs = response.data.routes[0].legs[0];
          return callback(legs);
        })
        .catch(error => {
          console.log('Failed calling directions API');
            return callback(new Error("Error getting google directions"))
        })
  }

Ответы [ 2 ]

0 голосов
/ 31 марта 2020

Я не знаю, является ли это окончательным решением, однако в коде есть ошибка:

const docRef = admin.firestore().doc('/temp_packages/')

Это утверждение должно выдавать ошибку:

Value for argument "documentPath" must point to a document, but was "${documentPath}". Your path does not contain an even number of components.

Ошибка выдается до docRef.set, поэтому она не будет учтена в операторе catch. Я пытался проверить это, но все мои попытки закончились с этой ошибкой. Может быть, эта ошибка где-то в ваших журналах.

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

0 голосов
/ 31 марта 2020

Для триггера HTTPS вам потребуется return {status: 'OK', code: 200, data: json}.

, чтобы он действительно отвечал через веб-сервер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...