Cloud Functions 错误:函数返回未定义、预期的 Promise 或值,以及 TypeError:无法读取未定义的属性“First_Name”

Posted

技术标签:

【中文标题】Cloud Functions 错误:函数返回未定义、预期的 Promise 或值,以及 TypeError:无法读取未定义的属性“First_Name”【英文标题】:Cloud Functions Error: Function returned undefined, expected Promise or value, as well as TypeError: Cannot read property 'First_Name' of undefined 【发布时间】:2019-03-09 06:11:44 【问题描述】:

我正在编写一个简单的云函数,它应该在创建新用户时在特定集合中创建一个具有特定名称的新文档。我尝试了各种编码方式,我想我已经想出了我认为最接近工作代码的方法,因为我可以单独获得它。这是有问题的代码:

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

exports.emailUserRegistration = functions.auth.user().onCreate((user) => 



admin.firestore().collection('UnauthenticatedUsers').doc(user.email).get()
.then(snapshot => 

  var userObject = 
    Email: user.email,
    First_Name: snapshot.data().First_Name, 
    Last_Name:snapshot.data().Last_Name,
    Password:snapshot.data().Password,
    Phone_Number:snapshot.data().Phone_Number,
    Address:snapshot.data().Address
;
  return admin.firestore().collection('Users').doc(user.uid).set(userObject);
)
.catch(error => 
    //Handle the error
    console.log('[YAX]',error)
)

);

而出现的问题如下:

1) 返回的函数未定义,需要一个 Promise 或值。我不明白为什么这是一个问题,因为 set 方法返回了一个 Promise。根据我从 Firebase 的官方 YouTube 频道和其他独立程序员 YouTuber 观看的各种教程,如果函数返回 Promise,您可以简单地返回该函数。

2) 类型错误:无法读取未定义的属性“First_Name”。我完全不知道为什么当我在 snapshot.data() 之后实际将它建议为可能的变量时,代码将无法读取“First_Name”。在 Visual Studio Code 中。

3) 标题中没有提到这一点,但出于某种原因,尽管出现了上述两个错误,但函数执行返回状态为:'ok'。

我是一名初级 android 开发人员,使用 Cloud Functions 是我从 Firebase 客户支持获得的建议和解决方案,但在问他们这个特定问题时,他们还没有回复我。请记住,我是 Node.js 的一个更大的初学者(在这个项目之前我从来没有做过任何事情),除了希望我的代码工作之外,我绝对想知道这里发生了什么,或者更简单术语我想了解代码的作用以及为什么它没有按照我的逻辑所说的那样做。

如果有人需要更多上下文,我将非常乐意提供。

【问题讨论】:

【参考方案1】:

第一个问题的答案

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

exports.emailUserRegistration = functions.auth.user().onCreate((user) => 


// return this function
return admin.firestore().collection('UnauthenticatedUsers').doc(user.email).get()
.then(snapshot => 

  var userObject = 
    Email: user.email,
    First_Name: snapshot.data().First_Name, 
    Last_Name:snapshot.data().Last_Name,
    Password:snapshot.data().Password,
    Phone_Number:snapshot.data().Phone_Number,
    Address:snapshot.data().Address
;
  return admin.firestore().collection('Users').doc(user.uid).set(userObject);
)
.catch(error => 
    //Handle the error
    console.log('[YAX]',error)
)
);

第二个问题的答案 最好上传 UnauthenticatedUsers 文档的图片。

 First_Name: snapshot.data().First_Name // this should be same as in your document and it is case sensitive also please check with your document.

希望对你有帮助......

【讨论】:

您的答案会起作用,但是由于 Firebase 的后端将用户存储在他们的数据库中以及其中的整个身份验证部分,有时当您尝试在用户通过身份验证之前检索他们的信息时,它'将返回一个空值。这是我从 Firebase 支持团队得到的官方声明。将来,当他们为用户开发 onValidate 触发器时,他们将能够克服这一困难:目前我们只有 onCreate 和 onDelete 可以使用。感谢您的回答:D

以上是关于Cloud Functions 错误:函数返回未定义、预期的 Promise 或值,以及 TypeError:无法读取未定义的属性“First_Name”的主要内容,如果未能解决你的问题,请参考以下文章

通过 Cloud Functions 返回后,Web Firebase var 从时间戳类型更改为对象类型

错误“snapshot.val”不是 Google Cloud Functions 中的函数

Cloud Functions for Firebase 错误:“400,不允许更改函数触发器类型或事件提供程序”

Firebase Cloud Functions 部署错误 - 超出配额

无法通过Cloud Functions(onCall)从Cloud Firestore返回一个json数组到Swift

在 Firebase Cloud Functions 中使用 async/await 时返回一个 Promise