NodeJS中Promise创建调用及Firestore查询错误捕获问题求助
问题分析与修复方案
你遇到的问题主要来自两个核心点:Promise链式调用的顺序逻辑错误和Express路由中错误处理的语法误用,下面一步步帮你解决:
1. 修复readFirestore函数的Promise逻辑
你原来的函数里先调用.catch()再调用.then(),这会导致即使捕获到Firestore的请求错误,后续的.then()仍然会执行(因为.catch()默认会返回一个resolved状态的Promise,除非主动重新抛出错误)。同时可以简化手动创建Promise的冗余写法:
var readFirestore = function(collection, doc){ // 简化空值判断,!doc可覆盖null、""、undefined场景 if(!doc){ return db.collection(collection).get() .then((snapshot) => { const response = []; snapshot.forEach((doc) => { response.push(doc.id); }); console.log(response); return response; // 直接返回结果,Promise会自动resolve该值 }) .catch((err) => { console.log('Error getting documents: ', err); throw err; // 抛出错误,让Promise进入reject状态 }); } // 补充doc不为空时的逻辑(你原代码未实现,建议添加) return Promise.reject(new Error('Doc parameter handling is not implemented')); }
关键优化点:
- 移除了手动创建Promise的冗余代码,直接返回Firestore请求的Promise链式调用结果
- 调整
.then()和.catch()顺序:成功时处理数据并返回结果,失败时捕获错误并抛出,确保Promise进入reject状态 - 简化空值判断逻辑,让代码更简洁
2. 修复Express路由的错误处理语法
你原代码里用逗号分隔.then()和错误处理函数,这相当于把错误处理当成了app.get的第二个回调,而非Promise的错误回调,因此永远不会触发。正确写法是使用.catch()方法:
app.get('/post', (req, res) => { readFirestore('fake', null) .then(response => { res.json(response); }) .catch(err => { // 用.catch()捕获Promise的reject状态 console.log(err); res.status(500).send(err.message || err); // 返回500状态码更符合HTTP规范 }); });
关键修改点:
- 将错误处理逻辑移至
.catch()方法中,确保Promise被reject时能触发错误处理 - 返回
500状态码,明确告知客户端这是服务器内部错误,比直接res.send(err)更符合HTTP协议规范
现在再测试传入错误集合名称,错误会被正确捕获并返回给客户端了。
内容的提问来源于stack exchange,提问作者Umar Yusuf
相关产品推荐
相关产品推荐

