如何使用更好的saveAsync扩展Mongoose原型

时间:2015-02-07 08:05:13

标签: javascript mongoose promise bluebird

我正在使用mongoose和蓝鸟初始化promisifyAll。这很酷,我很喜欢这些承诺。但是mongoose的model.save()会返回像(err, user, numAffected)这样的函数签名,因此bluebird' s model.saveAsync()会返回一个双元素数组,而不仅仅是明显的结果。这使链接不方便,所以我采取了这样的小辅助功能:

function saveUser(user) {
    return user.saveAsync()
        .spread(function (user, numAffected) {
            return user;
        });
}

在宣传猫鼬原型时添加它会更容易,只需在整个应用程序中执行一次......但我不知道如何。

2 个答案:

答案 0 :(得分:1)

这将在3.0中修复,但现在你可以使用过滤器和自定义promisifier:

// 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"));

答案 1 :(得分:0)

您可以修补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();
}