我已经有一段时间没有接触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
字段的数据,但我不知道为什么你会首先把它们放在那里,因为我认为把它存储在数据库中没有用处。此外,最好始终初始化变量以避免处理此类问题,如果尚未计算值,请使用空白值,如""
或{}
。