Express Router中findOneAndUpdate无响应问题求助
问题诊断与修复方案
嘿,我一眼就看到几个会导致你代码卡住的问题,咱们一个个理清楚:
1. 致命的语法错误(直接导致代码无法执行)
你在调用db.collection('Whisky'.findOneAndUpdate的时候,少了一个闭合的右括号!正确的写法应该是db.collection('Whisky').findOneAndUpdate(...)——这个语法错误会让JS引擎无法正确解析代码,异步操作根本没法启动,自然不会走到最后的console.log('result: ',result);。
2. 缺少错误捕获机制
你的代码没有对异步操作做错误处理,就算语法修复了,如果findOneAndUpdate抛出异常(比如ObjectId转换失败、数据库连接问题),错误会被wrapAsync静默吞掉,你看不到任何报错信息,只会觉得代码“没反应”。
3. 验证ObjectId转换的正确性
虽然你说数据库里存在这条记录,但要确认Archetype.to(req.params.id, ObjectId)确实把字符串ID转换成了有效的MongoDB ObjectId。如果转换失败,查询条件{ _id: ... }就匹配不到任何文档,update操作不会执行,但也不会抛出明显错误。
修正后的代码示例
router.patch('/update/:id', wrapAsync(async function(req) { console.log('id: ', req.params.id); console.log('req.body: ', req.body); try { // 修复collection调用的语法错误 const result = await db.collection('Whisky').findOneAndUpdate( { _id: Archetype.to(req.params.id, ObjectId) }, { $set: req.body }, { returnOriginal: false } ); console.log('result: ', result); return { result }; } catch (error) { // 捕获并打印错误,方便排查问题 console.error('Update failed:', error); // 根据业务需求返回错误响应 throw new Error('Failed to update document'); } }));
额外排查建议
- 单独测试
Archetype.to(req.params.id, ObjectId)的输出,确认它生成的是有效的ObjectId对象,而不是字符串或无效值。 - 如果还是没有结果,可以在
findOneAndUpdate之前先执行一个findOne查询,用同样的_id条件,看看能不能找到文档,验证查询条件是否正确。
内容的提问来源于stack exchange,提问作者Bill
相关产品推荐
相关产品推荐

