2017-09-02 97 views
0

我想爲模型編寫一些實例/靜態方法,它使用貓鼬的API並在使用mongoose的API之前和之後執行某些操作。Mongoose:用promise來編寫自己的方法

例如,我編寫自己的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,我只得到undefinedthen, 我得有問題。

此外,除了使createArticle的工作,有沒有辦法讓代碼更優雅?

謝謝。

回答

2

我自己找到了適用於我的方法。雖然我不是很瞭解的機制,也許我會嘗試以後它的工作...

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

更新:我搜索了一些關於承諾後,也許這可能會更好。

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