如何使用更好的 saveAsync 扩展 Mongooose 原型
How to extend Mongooose prototype with better saveAsync
我正在使用 mongoose 和使用 promisifyAll
初始化的 bluebird。这很酷,我喜欢承诺。但是 mongoose 的 model.save()
returns 是一个像 (err, user, numAffected)
这样的函数签名,所以 bluebird 的 model.saveAsync()
returns 是一个二元素数组,而不是单独的明显结果。这使得链接变得不方便,所以我开始制作像这样的小辅助函数:
function saveUser(user) {
return user.saveAsync()
.spread(function (user, numAffected) {
return user;
});
}
在向 mongoose 原型进行 promisification 时添加它会容易得多,并且只需要在整个应用程序中添加一次...但我不知道如何做。
你可以修补 user.saveAsync
var user_saveAsync = user.saveAsync;
user.saveAsync = function() {
return user_saveAsync.bind(this)() //-> same as calling `user.saveAsync()`
.spread(function(user) { // but now you're returning spreaded result
return user;
});
}
那你就可以了
function saveUser(user) {
return user.saveAsync();
}
这将在 3.0 中修复,但现在您可以使用过滤器和自定义承诺符:
// Promisifies only methods named "save"
Promise.promisifyAll(require("mongoose"), {
filter: function(name) {
return name === "save"
},
promisifier: function(save, defaultPromisifier) {
var saveAsync = defaultPromisifier(save);
return function() {
return saveAsync.apply(this, arguments).spread(function(first) {
return first;
});
}
}
});
// Promisify rest of the mongoose... it will ignore save as it was already promisified
Promise.promisifyAll(require("mongoose"));
我正在使用 mongoose 和使用 promisifyAll
初始化的 bluebird。这很酷,我喜欢承诺。但是 mongoose 的 model.save()
returns 是一个像 (err, user, numAffected)
这样的函数签名,所以 bluebird 的 model.saveAsync()
returns 是一个二元素数组,而不是单独的明显结果。这使得链接变得不方便,所以我开始制作像这样的小辅助函数:
function saveUser(user) {
return user.saveAsync()
.spread(function (user, numAffected) {
return user;
});
}
在向 mongoose 原型进行 promisification 时添加它会容易得多,并且只需要在整个应用程序中添加一次...但我不知道如何做。
你可以修补 user.saveAsync
var user_saveAsync = user.saveAsync;
user.saveAsync = function() {
return user_saveAsync.bind(this)() //-> same as calling `user.saveAsync()`
.spread(function(user) { // but now you're returning spreaded result
return user;
});
}
那你就可以了
function saveUser(user) {
return user.saveAsync();
}
这将在 3.0 中修复,但现在您可以使用过滤器和自定义承诺符:
// Promisifies only methods named "save"
Promise.promisifyAll(require("mongoose"), {
filter: function(name) {
return name === "save"
},
promisifier: function(save, defaultPromisifier) {
var saveAsync = defaultPromisifier(save);
return function() {
return saveAsync.apply(this, arguments).spread(function(first) {
return first;
});
}
}
});
// Promisify rest of the mongoose... it will ignore save as it was already promisified
Promise.promisifyAll(require("mongoose"));