使用Cloud Firestore和TypeScript的云功能无法执行

时间:2019-07-24 00:53:49

标签: typescript firebase google-cloud-firestore google-cloud-functions

编辑:深入研究指南并遵循Doug的回答后,我尝试编辑代码,但仍然无法使其正常工作。 这是我的新代码(index.ts):

import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';

admin.initializeApp(functions.config().firebase);
const db = admin.firestore();

export const createUser = functions.auth.user().onCreate((user)=>{
const newUser = new MyUser(user.uid, "Friend","", new Array, Array("en"),0,0,0 )
return db.doc("users/"+user.uid).set({newUser});
});

class MyUser{
    uid: String;
    first_name: String;
    last_name: String;
    communities_list: Array<string>;
    lang_list: Array<string>;
    reputation: Number;
    join_date: Number;
    last_activity: Number;
    constructor(uid:string, first_name:string, last_name:string, communities_list:Array<string>, lang_list:Array<string>, reputation:Number, join_date:Number, last_activity:Number) { 
      this.uid = uid;
      this.first_name = first_name; 
      this.last_name = last_name; 
      this.communities_list = communities_list; 
      this.lang_list = lang_list; 
      this.reputation = reputation; 
      this.join_date = join_date; 
      this.last_activity = last_activity; 
   }  
}

我是TypeScript和Cloud Functions的新手。 我尝试创建的两个测试是一个由auth触发器触发的测试,另一个是由创建新文档触发的测试。两种操作的结果都应该是对数据库的写操作,但实际上都不会发生写操作。

有人可以看到我的代码中的问题是什么吗? 另外,您可以调试云功能吗?我怎么知道我的代码失败了?

这些是我的功能:

import * as functions from 'firebase-functions';

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

const db = admin.firestore();

exports.createUser = functions.auth.user().onCreate((user)=>{

const userMap = new Map;
userMap.set("uid", user.uid);
userMap.set("first_name", "Friend");
userMap.set("last_name", "");
userMap.set("communities_list", new Array);
userMap.set("lang_list", new Array("sdsdf"));
userMap.set("reputation", 0);
userMap.set("join_date", 0);
userMap.set("last_activity", 0);

db.doc('users/'+user.uid).set({userMap});

});

exports.newIndiceAlgolia = functions.firestore.document('communities/{newCommunity}').onCreate((snap, context) => {

    const newValue = snap.data();

    if (newValue != null){
        const objectID = newValue.objectID;
        const title = newValue.title;
        const description = newValue.description;
        const members = 0;

        const map = new Map;
        map.set("objectID", objectID);
        map.set("title", title);
        map.set("description", description);
        map.set("members", members);


        db.doc('check_function/jjjj').set({map});
    }

  });



export const helloWorld = functions.https.onRequest((request, response) => {
 response.send("Hello from Firebase!");
});

第三个只是示例,它是在首次创建文档时就存在的,因此我将其保留为支票,并且效果很好。

2 个答案:

答案 0 :(得分:0)

尝试

export const newIndiceAlgolia 

因为您的代码具有2种不同的导出样式。

exports.newIndiceAlgolia
export const helloWorld

firebase控制台内部有一个日志标签。

答案 1 :(得分:0)

您将忽略对Firestore的所有异步调用中的所有承诺。为了为Cloud Functions编写有效的代码,您绝对需要了解JavaScript的诺言如何工作,因为Cloud Functions要求您返回一个诺言,该诺言只有在您的函数中所有异步工作完成后才能解决。如果您不这样做,那么您的工作可能会中断而无法完成。

根据您的情况,至少可以在正在执行的每个数据库操作之前放置一个return

return db.doc('check_function/jjjj').set({map});
return db.doc('users/'+user.uid).set({userMap});

您还将发现TypeScript Map对您不起作用。您将需要使用带有属性的普通JavaScript对象,以便将数据添加到Firestore。在TypeScript中,Map是一个特殊的集合,Firebase SDK不支持。