You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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('操作失败');
    }
});

额外提醒

  1. 一定要加上错误处理(上面代码里的catch和if(err)),否则遇到数据库连接失败、保存失败等情况时,你的请求会一直挂着或者返回模糊的错误。
  2. 原代码里的注释写的是Put请求但实际是Post,记得统一修正注释避免混淆~

内容的提问来源于stack exchange,提问作者Hemant Sood

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 16:12:52