在Firebase Functions中从Firestore获取数据时遇到问题

时间:2020-04-22 07:08:05

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

我试图捕获文档的更新并向所有用户发送通知,但是捕获值解析困难。

在console.log()中,这是捕获数据:

protocol MainViewModelInjected {
    var mainViewModel: MainViewModelProtocol { get }
}

extension MainViewModelInjected {
    var mainViewModel: MainViewModelProtocol { return MainViewModel.instance }
}

这是我的功能:

{ createdAt: Timestamp { _seconds: 1586881980, _nanoseconds: 0 },
  messages: 
   [ { content: 'Un nuevo comienzo para tod@s!\n:)\n?\n:-P\n?',
       createdAt: [Object],
       displayName: 'Fer...',
       photoUrl: 'https://lh3.googleusercontent.com/...',
       uid: 'IJchaq...' },
     { content: '?',
       createdAt: [Object],
       displayName: 'IMP...',
       photoUrl: 'https://lh3.googleusercont...' } 
       ...

如何从newValue获取最新的displayName和内容?

2 个答案:

答案 0 :(得分:2)

我通过更改为newValue?messages[0];

解决了该问题

答案 1 :(得分:1)

编辑:删除了我以前的解决方案,因为它根据@fenchai的注释引入了新的错误。当然,问题的症结在于处理打字稿中的值,该值可能为null或未定义。 Typescript将要求您对它们进行空检查。

我对此进行了进一步的研究,这则SF帖子有更多说明:https://stackoverflow.com/a/58401023/10303131

如@fenchai所述,您可以使用?运算符。

请阅读Typescript截至2019年末的发行说明:https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-7.html

感兴趣的项目:

可选链接:

// Make x = foo.bar(). If foo null or undefined, x will be undefined.
let x = foo?.bar()

空位合并:

// Makes x equal to foo, or if it is null/ undefined, call bar(). 
let x = foo ?? bar();

从firebase函数的角度来看,我仍然建议任何人在调用进一步的代码之前先对重要变量进行空检查,因为您将有机会澄清重要错误,因为firebase函数可能并不总是告诉您哪个值是未定义和问题的根本原因。

示例:

const message = myDocument?.data()?.message;
if (message === null || message === undefined){
    console.error("Message is undefined or null");
    // Proceed, or return if message vital to function.  
}