Mongoose:用 promise 编写自己的方法

Posted

技术标签:

【中文标题】Mongoose:用 promise 编写自己的方法【英文标题】:Mongoose: write own methods with promise 【发布时间】:2018-02-11 02:16:02 【问题描述】:

我想为一个模型写一些实例/静态方法,它使用 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,我只能在then中得到undefined, 我一定是搞错了。

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

谢谢。

【问题讨论】:

【参考方案1】:

我自己找到了适合我的方法。虽然我不是很了解这个机制,但也许我会在以后尝试研究它......

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
                );
    ,
);

【讨论】:

以上是关于Mongoose:用 promise 编写自己的方法的主要内容,如果未能解决你的问题,请参考以下文章

使用Async / await和mongoose

mongoose 文档 Promises

猫鼬承诺错误

在 Mongoose 路由中使用 Promise

Mongoose:使用 Promise 作为其他函数的参数

使用 Promises 处理 Mongoose 错误