Mongoose 错误:lodash bind 不再接受回调函数

问题描述 投票:0回答:1

升级到 MongoDB 7 删除了函数回调,正如其他线程中所讨论的那样。大多数时候,用 .then asyn/await 等替换回调相当容易,如 MongooseError: Model.findOne() 不再接受 Function 处的回调所述。但这让我感到困惑:

return _.bind(function(req, res, next) {
  var query = this.getQuery(req);
  async.waterfall([
    _.bind(query.exec, query),
  ], this.sendData(req, res, next));
}, this);

将 lodash 绑定函数包装在 async.waterfall 中具有承诺的效果: this.sendData 仅在绑定函数完成后执行。但是,“_.bind(query.exec, query)”表达式引发“不再接受回调函数”异常。那么我该如何重写以避免异常呢?

继续:我可以通过此调用从数据库获取数据:

query.exec() .then(result => {
     console.log(result);
 })

所以我可以不使用异步包装器并执行类似的操作:

return _.bind(function(req, res, next) {
    var query = this.getQuery(req);
    query.exec() .then(result => {
       this.sendData(req, res, next);  
   });
})

目前这不起作用,因为查询结果需要绑定到 this 对象。我不知道该怎么做。

mongodb mongoose callback lodash bind
1个回答
0
投票

在您建议的使用承诺的解决方案中,看起来问题是因为您在

this
函数中缺少这个
_.bind
而引起的。

该函数应如下所示:

return _.bind(function(req, res, next) {
    var query = this.getQuery(req);
    query.exec().then(result => {
       this.sendData(req, res, next);  
   });
}, this)

您还可以通过使用外部包装器的箭头函数来完全替换对

_.bind
的调用,但也许您使用它是有原因的 - 例如

return (req, res, next) => {
  this.getQuery(req).exec().then(result => {
    this.sendData(req, res, next);
  });
}
© www.soinside.com 2019 - 2024. All rights reserved.