簡體   English   中英

如何獲取請求firebase雲功能

[英]how to make get request firebase cloud functions

我正在開發一個應用程序,我想將我的用戶坐標從firestore發送到locationiq.com以獲取詳細信息然后在firestore中寫入我使用firebase雲功能來發出GET請求但是我認為它失敗了有人可以幫我解決這些問題

我收到了這個錯誤

Function returned undefined, expected Promise or value

const functions = require('firebase-functions');
const request = require('request');
const admin = require ('firebase-admin');
admin.initializeApp();

// Create and Deploy Your First Cloud Functions.
// https://firebase.google.com/docs/functions/write-firebase-functions

exports.geoCoder = functions.firestore
    .document('geocoder/{location}').onCreate((snap, context) => {
        const latitude = snap.data().coordinate.latitude;
        const longtude = snap.data().coordinate.longtude;
        var part1 = "https://us1.locationiq.com/v1/reverse.php?key=XXXXXXXXXXXXXX&lat=";
        var part2 = "&lon="
        var part3 = "&format=json"

        request(part1 + latitude + part2 + longtude + part3, { json: true }, (err, res, body) => {
          if (err) { 
          console.log(err); 
          }
          console.log(body.address);
        });
      });

更新我面臨同樣的錯誤。

const functions = require('firebase-functions');
const request = require('request');
const admin = require ('firebase-admin');
admin.initializeApp();

exports.geoCoder = functions.firestore.document('geocoder/{location}').onCreate((snap, context) => {
      const latitude = snap.data().coordinate.latitude;
      const longtude = snap.data().coordinate.longtude;
      var part1 = "https://us1.locationiq.com/v1/reverse.php?key=XXXXXXXXXXXXXX&lat=";
      var part2 = "&lon="
      var part3 = "&format=json"

      request(part1 + latitude + part2 + longtude + part3, { json: true }, (err, res, body) => {
        if (err) { 
          console.log(err);
          return 0;
        }
        return admin.firestore().doc("geocoder/" + context.params.location).update({city: body.address.state})
      });
});

抱歉我的英語

正如Doug在上面的評論中所解釋的那樣,你需要返回一個Promise。

您正在使用的request庫本身支持回調接口,但不返回承諾

您可以使用request-promisehttps://github.com/request/request-promise )和“返回常規Promises / A +兼容承諾”的rp()方法,然后按如下方式調整代碼:

const functions = require('firebase-functions');
const admin = require ('firebase-admin');
const rp = require('request-promise');
admin.initializeApp();

exports.geoCoder = functions.firestore
  .document('geocoder/{location}')
  .onCreate((snap, context) => {
    const latitude = snap.data().coordinate.latitude;
    const longtude = snap.data().coordinate.longtude;
    const part1 =
      'https://us1.locationiq.com/v1/reverse.php?key=XXXXXXXXXXXXXX&lat=';
    const part2 = '&lon=';
    const part3 = '&format=json';

    const options = {
      uri: part1 + latitude + part2 + longtude + part3,
      json: true // Automatically parses the JSON string in the response
    };

    return rp(options)
      .then(parsedBody => {
        return admin
          .firestore()
          .doc('geocoder/' + context.params.location)
          .update({ city: parsedBody.address.state });
      })
      .catch(err => {
        console.log(err);
        return null;
      });
  });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM