Mongoose - 查询 exec() 永远不会在模型方法中解析

Posted

技术标签:

【中文标题】Mongoose - 查询 exec() 永远不会在模型方法中解析【英文标题】:Mongoose - Query exec() never resolves in model method 【发布时间】:2017-09-06 13:34:40 【问题描述】:

为了尝试重构一些将在不同地方使用的代码,我将这个已经在控制器中工作的方法移到了 Mongoose 模型中。

在模型中,trackQuery.exec() 永远不会到达回调,永远不会解析。如果我在没有exec() 或不等待exec() 的情况下解决问题,它可以正常工作。 trackQuery 用 Mongoose Query 正确填充。

Mongoose 模型的微妙之处是什么?

ArtistSchema.methods.insertRelatedTracks = function (items) 
    const newTracksToSave = items.map((item) => 
        return new Promise((resolve, reject) => 
            const TrackModel = mongoose.model('Track'),
                trackQuery = TrackModel.findOne( externalID: item.id )
            ;

            return trackQuery.exec((err, track) => 
                if (err)  
                    return reject(err);
                

                if (!track) 
                    let track = new TrackModel(
                        externalID: item.id,
                        provider: item.provider,
                        title: item.title,
                        artist: item.artist,
                        artistID: this._id,
                        artistExternalID: this.externalID,
                        thumbnail: item.thumbnail,
                        publishedAt: item.publishedAt,
                        count: 0
                    );

                    return track.save((err, res) => 
                        if (err) 
                            return reject(err);
                        

                        return resolve(res);
                    );
                

                return resolve(track);
            );
        );
    );

    return Promise.all(newTracksToSave).then(() => 
        return this;
    ).catch((err) => 
        console.error(err);
        return this;
    );

【问题讨论】:

【参考方案1】:

我的解决方案是手动导入TrackModel,而不是依赖通常的运行时mongoose.model('Track') 方法。我没有解释为什么mongoose.model 在这种情况下不起作用。欢迎任何提示。

【讨论】:

这可能与您的问题无关,但.exec() 已经返回了一个承诺,因此不需要用额外的new Promise(...) 包装Mongoose 查询。您当前代码的一个可能问题是,如果轨道不存在,您仍然会解决空/未定义 track 变量的承诺,并且它将解决 beforeresolve(res) 的调用.所以代码应该是if (! track) ... else return resolve(track) @robertklep 感谢您的评论! :) 这绝对不相关,因为代码中唯一的区别是导入TrackModel 的方式。另一方面,我的印象是,无论是否 Promises,return 都会停止相同范围内的执行。如果没有轨道,return track.save... 将阻止到达return resolve(track);。我错了吗? 对不起,我的错,我错过了track.save()前面的return。请忽略我评论的那部分;D

以上是关于Mongoose - 查询 exec() 永远不会在模型方法中解析的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose - find(,cb) 和 find().exec(cb) 有啥区别?

Mongoose 查找和删除

Mongoose 多个查询在第二次查询后返回

process.waitFor() 永远不会返回

Mongoose .find() 方法导致请求挂起

在任何传入的回调完成后是不是会发生 Mongoose 查询 `then` 调用?