Mongoose: 为模型保存操作添加“承诺”返回值

创建于 2013-04-16  ·  50评论  ·  资料来源: Automattic/mongoose

添加 promise return 支持以保存操作,当前返回 undefined。 根据需要更新的验证和保存状态,有多个返回路径。 这将允许使用 .then() 链接多个保存操作而不是嵌套。

enhancement

最有用的评论

现在我正在这样做:

userSchema.methods.saveAsync = function() {
  return new Promise((resolve,reject) => {
    this.save((err) => {
      if(err) return reject(err)
      resolve()
    })
  })
}

所有50条评论

我将此添加到 4.x 的列表中。 与中间件的实现方式有关(hooks.js)。

太好了,谢谢。 我已经为我的项目实现了一个 jquery 的 .when 作为 mongoose Promise 对象的扩展。 你有兴趣提出拉取请求吗?

var p1 = Users.find();
var p2 = Animals.find();
Promise.when(p1, p2).addBack(function(err, users, animals) {
//等等
});

不用了,谢谢。 我真的不想添加更多可以在猫鼬之外实现的功能。 它已经肿了。

对于找到此线程的其他人,这里是: https ://github.com/wshaver/mongoosewhen

@wshaver将其发布到 npm 并添加一个 mongoose 标记,以便它显示在http://plugins.mongoosejs.com

移至此处以符合其他 Mongoose 插件在名称中使用破折号: https ://github.com/wshaver/mongoose-when

发布到 npm,标记。 还没有出现,但可能有延迟。

@wshaver很酷。 它每天更新一次。

在深入研究#1446 之后,我想我可以在不删除“hooks.js”的情况下实现这一目标。
绿灯?

大胆试试吧

2013 年 10 月 7 日,星期一,Refael Ackermann 写道:

在深入研究#1446 https://github.com/LearnBoost/mongoose/issues/1446之后,我想我可以在不删除“hooks.js”的情况下实现这一点。
绿灯?


直接回复此邮件或在 Gi tHub上查看 https://github.com/LearnBoost/mongoose/issues/1431#issuecomment -25792310
.

亚伦
@aaronheckmann https://twitter.com/#!/aaronheckmann
soundcloud.com/ajhecky
github.com/aheckmann

大公关准备就绪

这对我也很有帮助。 应该可以调用 myDoc.save().exec() - 所以基本上 save 应该返回一个可以执行的查询。 或者是什么原因,Save 不返回查询?

如果我们省略回调,则 +1 承诺返回

该修复程序位于master分支中,计划包含在 3.10 中。

这是否包括模型创建操作的返回承诺?

@GDownes create()已经返回一个承诺:) http://mongoosejs.com/docs/api.html#model_Model.create

3.10 的任何计划发布日期? :)

@swayf 4.0 还需要几个月的时间。 我在沙滩上的路线是 9 月 2 日,但希望在那之前:)

这是否仍安排在即将发布的版本中?

是的,这将是 4.0,但是,仍然没有发布日期。 最后的估计不太对:(

:+1:

+1 因为:

我需要在钩子之前在 mocha 测试中保存 2 个文档,并且此功能将允许我在保存两个模型后执行done()回调。

我尝试使用Collection.insert([docs], done)方法,但它不会触发我需要散列一些值的Schema.pre('save')逻辑。

@arathael ,您始终可以使用异步模块将两个文档保存在async.parallel中并在回调中执行完成

谢谢大佬,我现在正在测试。 我刚刚加入,因为我认为来自 ODM 的本地支持会动摇。

+1

我使用 6to5 的实验性 ES7 等待/异步。 如果 record.save() 返回了一个承诺,我可以这样做:

try {
  await record.save()
} catch(err) {
  ...
}

现在我正在这样做:

userSchema.methods.saveAsync = function() {
  return new Promise((resolve,reject) => {
    this.save((err) => {
      if(err) return reject(err)
      resolve()
    })
  })
}

+1 为@aaronshaf ,对我很有用,我也会在 ES5 中为那些不使用 ES6 的人编写它。 谢谢

这是我现在所做的。 显然 Q 不是必需的,但这是我在其他地方用于承诺的。

/*
 * Hack until mongoose 3.10 comes out. See this: https://github.com/LearnBoost/mongoose/issues/1431
 */
mongoose.Document.prototype.savePromise = function () {
    var that = this;
    return Q.Promise(function(resolve, reject) {
        that.save(function (err, item, numberAffected) {
            if (err) {
                reject(err);
            }
            resolve(item, numberAffected);
        });
    });
};

mongoose.Document.prototype.removePromise = function () {
    var that = this;
    return Q.Promise(function(resolve, reject) {
        that.remove(function (err, item) {
            if (err) {
                reject(err);
            }
            resolve(item);
        });
    });
};

+1 hack @jhullfly但是我认为 Q 的解决方案只需要一个参数,因此 numberAffected 被删除,需要将它们放在一个数组或其他东西中才能访问两者:

mongoose.Document.prototype.savePromise = function () {
    var that = this;
    return Q.Promise(function(resolve, reject) {
        that.save(function (err, item, numberAffected) {
            if (err) {
                reject(err);
            }
            resolve([item, numberAffected]);
        });
    });
};

1+ 承诺从保存中返回!

现在save在 4.0.1 中返回承诺。 干杯。

+1

@arathael +1

是否有与如何将save与 Promises 一起使用的文档?

我尝试了以下方法,但似乎没有用:

var User = mongoose.model('User');
var u = new User();
u.save().then(function() {
// never gets here.
});
// I even tried the following, and neither works.
u.save().then(function() {}).end();

你在 mongoose 4.0.1 上,你 npm 安装了吗?

@Ouwen是的,我正在运行 4.0.1,是的,我运行了,否则如果未安装 mongoose,我会收到错误消息。

问题是then似乎永远不会被调用。 我很确定我在做一些奇怪的事情(否则会很快提交错误),但我无法推理,这就是我很想知道是否有任何示例/文档围绕它。

嗯,很奇怪。 我知道我正在运行 3.8.8 并且忘记了 npm install 将其升级到 4.0.1 这就是为什么没有从 u.save() 返回承诺

你所写的应该有效。

@limianwang您是否成功连接到 mongodb 服务器? 你能给我一个独立的例子来重现这个吗?

.save() 返回的 promise 对象似乎与其他 promise 不同,它具有 catch/caught 而不是 onReject。

猫鼬 4.1.10 和...

var u = new User();
u.save().then(...)

仍然不返回承诺

@xrado请提供一个更实质性的例子。 我们已经进行了测试以表明它应该在 mongoose 4.1.10 中工作。

@vkarpov15我的错,我又试了一次并且可以工作..我不知道我之前在做什么..对不起

我有同样的问题,Save 立即将数据保存到数据库中,并且不调用 then 中的代码。 奇怪的是,我有另一个代码和平,确实调用了 then 块并且承诺有效。

代码( user.save() 部分保存它,然后未定义但从未调用)

user.save().then( function(userX) { // 保存作品
控制台.log(2); // 这没有被调用
}).end() // 未调用
.then(未定义,函数(错误){
console.log('err:' + err ); // 未调用
});

更新我使用了旧方法,它的工作方式如下:

user.save(function (err, newuser) {
if (err) console.log('err=' + err);
console.log('用户已保存');
});

WTF:解决方案是简单地将猫鼬的版本从“3.8.X”更改为 ^4.1.9

然后 user.save().then( function(userX) { // 保存作品
控制台.log(2);
})。结尾()
.then(未定义,函数(错误){
console.log('err:' + err );
});

作品!!!!!!!!!!! 甜的....

@nickjohngray很高兴你明白了 :) 我强烈建议你在继续使用 mongoose 的 Promise 之前阅读文档上的 Promise 指南——别担心,它只是简短的阅读。

我有同样的问题......我真的希望我不必为了在承诺中工作而降级整个主要版本。

@jhyland87请提供代码示例,以便我了解问题所在。

@vkarpov15我做到了,在

这是在另一张票中修复的......

基本上,这段代码:

var User = mongoose.model('User');
var u = new User();
u.save().then(function() {
// never gets here.
});

保存文档时只需要添加return .. 所以:

var User = mongoose.model('User');
var u = new User();
return u.save().then(function() {
// never gets here.
});

@jhyland87 ,仅供参考 -与 Mongoose 链接承诺的另一个示例。

这仍然是一个问题吗?

我有以下代码(使用 TypeScript)...

User.findById(id)
.exec()
.then((user) => {
  user.name = 'new name from wherever!';
  return user.save();
})
.then((user) => {
  // want to do more stuff with the user object once it has been saved successfully...
  // ... but it never makes it here!!!
};

但是,当我向save()函数添加一个空回调时,一切似乎都很好,如下所示......

User.findById(id)
.exec()
.then((user) => {
  user.name = 'new name from wherever!';
  return user.save(() => {
    // unwanted empty callback... hmmm?
  });
})
.then((user) => {
  // we made it here!!! but now...
  // user === undefined :(
};

你在使用承诺吗? 尝试切换到mongoose.Promise = global.Promise;

此页面是否有帮助?
0 / 5 - 0 等级