Node.js+MongoDB:如何用其他操作生成的ID更新文档
解决Promise链中无法获取前序结果的问题
你的问题出在Promise链的上下文传递上:第一个then里只返回了DocumentB.create的Promise,导致后续then无法访问第一个文档的result对象。下面是两种可行的修复方案:
方案1:在Promise链中传递前序结果
在第一个then中,执行DocumentB.create后,将第一个文档的结果与第二个文档的结果一起返回,让后续then能同时获取两个值:
DocumentA.create({ something }) .then((resultA) => { // 同时返回第一个文档和第二个文档的创建结果 return DocumentB.create({ x: resultA.id }).then(resultB => ({ resultA, resultB })); }) .then(({ resultA, resultB }) => { // 直接使用resultA._id更新文档 return DocumentA.updateOne({ _id: resultA._id }, { $set: { y: resultB.id } }); }) .catch(err => { // 务必添加错误处理,避免未捕获的Promise异常 console.error('操作失败:', err); });
方案2:使用async/await(更易读)
用async/await语法可以让异步代码逻辑更清晰,所有变量都在同一个作用域内,无需手动传递上下文:
async function handleDocumentCreation() { try { // 按顺序执行异步操作 const resultA = await DocumentA.create({ something }); const resultB = await DocumentB.create({ x: resultA.id }); await DocumentA.updateOne({ _id: resultA._id }, { $set: { y: resultB.id } }); } catch (err) { console.error('操作失败:', err); } } // 调用执行函数 handleDocumentCreation();
关键原因说明
原代码中,第一个then的返回值是DocumentB.create()的Promise,所以第二个then只能接收到这个Promise的resolve结果(即result2),第一个文档的result对象因为作用域问题无法被访问。通过传递组合对象或使用async/await,就能保留对第一个文档结果的引用。
内容的提问来源于stack exchange,提问作者Peter Double U
相关产品推荐
相关产品推荐

