调用Firestore中的集时捕获异常



我已经有一段时间没有接触JS或Firebase了,所以请原谅样式问题。我在DocumentReference上调用set时遇到问题。值不能为undefined。这很好,但我希望我的catch块能捕捉到异常,但整个函数却崩溃了(这是在一个云函数中(。我试着简化代码:

app.get('/test', (req, res) => {    
return db.collection('users').doc('someid').set({
first: undefined
})
.then(()=> {
res.send('it worked?');
})
.catch((error: any) => {
console.error(error);
res.status(500).send('it didn't work');
})
})

需要注意的是,我正在使用ExpressJS,并在Firebase函数模拟器中进行测试,编写到真正的Firestore中。

所以我的问题是,为什么错误没有被发现?相反,我收到了一个包含异常详细信息的响应。在调用set之前检查值的解决方案吗?如果是这样的话,考虑到上面链接的文档中没有写它,你怎么会知道呢?

问题是set()函数在返回promise之前抛出异常,因为参数无效,所以您应该验证对象是否没有未定义的字段。

通过实验,我发现它接受null,所以这里有一种解决这个问题的方法:

let firstValue;
app.get('/test', (req, res) => {    
return db.collection('users').doc('someid').set({
first: firstValue || null
})
.then(()=> {
res.send('it worked?');
})
.catch((error: any) => {
console.error(error);
res.status(500).send('it didn't work');
})
})

我在文档中没有发现任何迹象表明set()函数不接受带有undefined字段的数据,但我不知道为什么你会首先把它们放在那里,因为我认为把它存储在数据库中没有用处。此外,最好始终初始化变量以避免处理此类问题,如果尚未计算值,请使用空白值,如""{}