通过Firebase云功能将数据发送回Android

时间:2018-05-21 12:47:33

标签: node.js firebase google-cloud-firestore google-cloud-functions

我想通过functions.https.onCall发回数据,代码工作并将数据返回到控制台,但我不知道为什么我不能将数据发送回设备(作为回报)第一,我明白为什么返回数字2因为异步任务而无效,所以有一种方法可以在它完成之后?)。

const admin = require('firebase-admin');
const functions = require('firebase-functions');
admin.initializeApp(functions.config().firebase);
var posts= new Array();
var finalposts = new Array();
function post (uid,text,user_name,vid,sendtime,vote,tag,pic,lan){
  this.uid=uid;
  this.text=text;
  this.user_name=user_name;
  this.vid=vid;
  this.sendtime=sendtime;
  this.vote=vote;
  this.tag=tag;
  this.pic=pic;
  this.lan=lan;
}

exports.getWarm = functions.https.onCall((data, context) => {
finalposts = [];
posts = [];
db.collection('local uploads/heb/posts').where('vote', '<', 200).where('vote', '>', 100).get()
    .then((snapshot) => {
      snapshot.forEach((doc) => {
        posts.push( new post(doc.data()["uid"],doc.data()["text"],doc.data()["user_name"],doc.data()["vid"],
          doc.data()["sendtime"],doc.data()["vote"],doc.data()["tag"],doc.data()["pic"],doc.data()["lan"])); 
      });
      posts.sort(function(a,b) {return (a.sendtime<b.sendtime)? 1:((a.sendtime>b.sendtime)? -1:0);});
          for (var i =0; i<data.refresh_num*2; i++) {
      finalposts.push(posts[i]);
    }
    console.log('hey', '=>', finalposts);
    //  working: the posts are shown in the console
// (1.) return { posts: finalposts };
// returns null
    })
    .catch((err) => {
      console.log('Error getting documents', err);
    });
// (2)return { posts: finalposts };
//  returns {posts=[]}
return { posts: 'data' };
//  returns {posts=data}
});

2 个答案:

答案 0 :(得分:0)

您需要从Firebase功能返回Promise才能返回数据。尝试在db.collection之前添加返回,看看是否有效。

来自文档:https://firebase.google.com/docs/functions/callable

  

要在异步操作后返回数据,请返回一个promise。

编辑:我对Firebase Firestore不是很熟悉,但是生成promise的任何调用都会在它之前添加一个return语句。

此外,根据我的经验,您需要使用return { posts: 'data' };移动then以在最后一次承诺后执行

答案 1 :(得分:0)

那么它更简单然后我想,我只需要归还它。

exports.getWarm = functions.https.onCall((data, context) => {
finalposts = [];
posts = [];
return db.collection('local uploads/heb/posts').where('vote', '<', 200).where('vote', '>', 100).get()
    .then((snapshot) => {
      snapshot.forEach((doc) => {
        posts.push( new post(doc.data()["uid"],doc.data()["text"],doc.data()["user_name"],doc.data()["vid"],
          doc.data()["sendtime"],doc.data()["vote"],doc.data()["tag"],doc.data()["pic"],doc.data()["lan"])); 
      });
      posts.sort(function(a,b) {return (a.sendtime<b.sendtime)? 1:((a.sendtime>b.sendtime)? -1:0);});
          for (var i =0; i<data.refresh_num*2; i++) {
      finalposts.push(posts[i]);
    }
    console.log('hey', '=>', finalposts);
return { posts: finalposts };
    })
    .catch((err) => {
      console.log('Error getting documents', err);
    });

});