使用auth.user()。onCreate时无法读取未定义的属性'uid'

时间:2018-12-27 15:12:25

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

注册新帐户时出现此错误。我使用的代码:

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

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

    var randInt = (Math.floor(Math.random() * 8) + 1);
    var userObject = {
        u_n : user.uid, // user nickname
        u_n_c : admin.database.ServerValue.TIMESTAMP, // next date to change nick
        u_a : randInt.toString(), // user avatar
        u_a_c : admin.database.ServerValue.TIMESTAMP, // next date to change avatar
        d : admin.database.ServerValue.TIMESTAMP, // date the account was created
        u_p : 0 // user points
    };
    admin.database().ref('userInfo/' + user.uid).set(userObject);
    admin.database().ref('nicknames/' + user.uid).set(user.uid);
});

我在日志中状态为“错误”的功能已完成,并且数据库中未添加任何内容。

1 个答案:

答案 0 :(得分:2)

您将忽略set()返回的promise,后者是异步的。使用Cloud Functions后台类型函数,您必须返回仅在所有异步工作完成后才能解决的Promise。由于您有两项工作,因此需要一个新的Promise,当这两项都得到解决时,它就会解决。

首先,您应该阅读有关终止函数的文档,以及watch the video series有关如何处理Cloud Functions中的promise的文档,以便您了解需要做什么。

然后,您将意识到需要执行以下操作:

const p1 = admin.database().ref('userInfo/' + user.uid).set(userObject);
const p2 = admin.database().ref('nicknames/' + user.uid).set(user.uid);
return Promise.all([p1, p2]);

同样使用Cloud Functions,您应该像这样不使用参数来初始化Admin SDK:

admin.initializeApp();

现在不建议您这样做。