如何在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
相关产品推荐
相关产品推荐

