Express.js中MongoDB save()后find()无法获取最新数据的问题
解决MongoDB保存后查询不到最新数据的异步问题
你猜的没错,这确实是异步操作的顺序问题!newTask.save()是一个异步方法,它不会立刻完成数据库的写入操作,但你的代码里在调用save()之后马上就执行了find()——这时候新数据还没真正存入数据库,所以查询结果自然看不到刚添加的内容。
怎么修复?
核心思路是:必须等save()操作完全完成后,再执行find()查询。这里有两种常用的实现方式:
方式1:使用Promise链式调用
把find()操作放到save()的.then()回调里,确保只有当保存成功后才去查询:
app.post('/form-submit', function(req, res) { connect.then((db) => { var newTask = taskSchema({ Task: req.body.Task }); // 等待save完成后再执行后续操作 return newTask.save(); }).then(() => { // 此时数据库已完成新数据写入,执行查询 taskSchema.find({}, function(err, val) { if (err) { // 别忘了处理错误! console.error('查询出错:', err); return res.status(500).send('查询失败'); } console.log(val.length); // 现在能看到包含新数据的长度了 res.render('showTask.ejs', { todoTask: val }); }); }).catch(err => { // 处理连接或保存过程中的错误 console.error('数据库操作出错:', err); res.status(500).send('数据保存失败'); }); });
方式2:使用async/await(更简洁易读)
用async标记路由处理函数,然后用await等待异步操作完成:
app.post('/form-submit', async function(req, res) { try { await connect; // 等待数据库连接完成 var newTask = taskSchema({ Task: req.body.Task }); await newTask.save(); // 等待数据保存完成 // 现在执行查询 const val = await taskSchema.find({}); console.log(val.length); res.render('showTask.ejs', { todoTask: val }); } catch (err) { console.error('操作出错:', err); res.status(500).send('操作失败'); } });
额外提醒
- 一定要加上错误处理(上面代码里的
catch和if(err)),否则遇到数据库连接失败、保存失败等情况时,你的请求会一直挂着或者返回模糊的错误。 - 原代码里的注释写的是Put请求但实际是Post,记得统一修正注释避免混淆~
内容的提问来源于stack exchange,提问作者Hemant Sood
相关产品推荐
相关产品推荐

