猫鼬:用诺言写自己的方法

时间:2017-09-02 02:44:10

标签: node.js mongoose promise es6-promise

我想为模型编写一些实例/静态方法,它使用mongoose的API并在使用mongoose的API之前和之后做一些事情。

例如,我编写自己的Article.createArticle方法,它会在Article.create之前检查数据,并在创建后返回article.toObject()

这就是我希望createArticle工作的方式:

Article.createArticle({someKeys: 'SomeData', ...})
    .then(obj => {
         // get plain object here
    });

我试着写这样的东西:

Article.Schema.static({
    createArticle: function(data) {
        return new Promise(function(resolve, reject){
            checkDataKeys(data);
            resolve(mongoose.model('Article').create(data)
                .then(article => resolve(article.toObject()));
            );
        });
    },
});

使用此createArticle,我只在undefined中获得then, 我必须犯错。

此外,除了使createArticle工作之外,还有什么办法可以让代码更优雅吗?

感谢。

1 个答案:

答案 0 :(得分:3)

我自己找到了适合我的方法。虽然我不太了解这种机制,但也许我会在以后尝试解决这个问题......

ArticleSchema.static({
    createArticle: function(data) {
        checkDataKeys(data);    // pre works
        return mongoose.model('Article').create(data)
               .then(obj => {
                   return obj.toObject(); // afterworks
                                          // here, just get the plain obj from doc
                                          // and *return* it
                });
    },
});

更新:在我搜索了一些关于Promise的内容之后,也许这会更好。

ArticleSchema.static({
    createArticle: function(data) {
        checkDataKeys(data);    // pre works
        return mongoose.model('Article').create(data)
               .then(obj => {
                   return Promise.resolve(obj.toObject());
                   // Some say that this is totally same as directly return
                })
                .catch(err => {
                   return Promise.reject(err);
                   // if error, this will ensure the err will be caught
                   // for some async cases
                });
    },
});