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

如何在Mongoose查询的then函数中获取查询参数值?

如何在Mongoose异步查询的then回调中获取原始查询参数?

我正在使用如下Mongoose查询:

let Value = 'START'
myCollection.findOne({param:Value}) .then((doc) => {
    if (!doc) {
        // 此时集合中未找到文档
        // 我需要记录查询时使用的参数'Value'
        // 示例中应为'START'
        log(Value) // => 因异步查询延迟,有时Value变为'END'
    }
})
Value = 'END'

有时查询无结果,这并非错误,但我需要记录该场景下的查询参数。但doc参数为null,且因异步执行,进入then函数时Value已被修改,无法使用该变量获取原参数。请问如何在then函数内获取查询参数值?


解决方案

1. 利用闭包保留原始参数值

通过创建局部作用域封装查询逻辑,用函数参数固定当时的Value值,不受后续变量修改影响:

function queryAndLog(currentValue) {
  myCollection.findOne({ param: currentValue })
    .then(doc => {
      if (!doc) {
        log(currentValue); // 始终是调用时传入的'START'
      }
    });
}

let Value = 'START';
queryAndLog(Value);
Value = 'END';

2. 在Promise链中传递原始参数

在第一个then回调里把原始参数和查询结果一起封装返回,后续回调直接取用未被修改的参数:

let Value = 'START';
myCollection.findOne({ param: Value })
  .then(doc => {
    // 打包查询结果与原始参数
    return { doc, originalParam: Value };
  })
  .then(({ doc, originalParam }) => {
    if (!doc) {
      log(originalParam); // 这里拿到的是初始的'START'
    }
  });
Value = 'END';

3. 使用async/await简化异步逻辑

如果场景允许,用async/await让异步代码按同步顺序执行,确保修改Value的操作在查询完成后才触发:

async function checkAndLog() {
  let Value = 'START';
  const doc = await myCollection.findOne({ param: Value });
  if (!doc) {
    log(Value); // 此时Value未被修改,值为'START'
  }
  Value = 'END';
}

checkAndLog();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 22:24:54