2017-04-25 18 views
0

約束どおりに変換する他の方法はありますか?青写真の約束関数は約束に変換されていない

var Promise = require("bluebird"); 
let findOneOrCreate = require('mongoose-find-one-or-create'); 
findOneOrCreate = Promise.promisify(findOneOrCreate); // not converted to promise 

は私が)(.thenで、その後同じように使用: -

 db.employee.findOneOrCreate({ 
       organization: model.organization.id, 
       EmpDb_Emp_id: model.EmpDb_Emp_id 
      }, model) 
      .then((employee, created) => { 
       if (!created) { 
        throw 'employee already exist'; 
       } 
       return employee; 
      }).catch(err => { 
       throw err; 
      }); 

は、それがエラーを与える: -

まず未定義

+1

「エラーが発生しました」 - 何がありますか?あなたが投稿したコード? (おそらく、あなたは '.then'を使わないでしょう) - あなたは約束で何をしているのか確信していますか? –

+1

'promisify'は約束を返しません - 呼び出されると約束を返す*関数*を返します。あなたはそれをどこから呼びますか? – Bergi

+0

'mongoose-find-one-or-create'モジュールに欠陥(競合条件)がある場合は、組み込みの[' findOneAndUpdate'](http://mongoosejs.com/docs/api.html#query_Query -findOneAndUpdate)と 'upsert:true'を組み合わせたものです。それは、あなたが何かを約束する必要はないことを意味します。なぜなら、Mongooseは[すぐに]約束を支持するからです(http://mongoosejs.com/docs/promises.html)。 – robertklep

答えて

2

の 'を' プロパティを読み取ることができません。 、bluebird documentation

mongoose-find-one-or-createは、引数としてschemaのみを受け入れ、findOneOrCreate機能でこのスキーマを拡張します。だから、require('mongoose-find-one-or-create')は約束できないようです。代わりに拡張スキーマのfindOneOrCreateをpromisifying試みることがあります。

var findOneOrCreate = require('mongoose-find-one-or-create'); 
var PersonSchema = mongoose.Schema({...}); 
PersonSchema.plugin(findOneOrCreate); 
var Person = mongoose.model('Person', PersonSchema); 
var findOneOrCreatePromise = Promise.promisify(Person.findOneOrCreate); 

また、あなたがthenを呼び出す前に、それを起動する必要がありますのでPromise.promisify()は、関数を返すことに注意してください:

findOneOrCreatePromise().then(...) 

だけでなく

findOneOrCreatePromise.then(...) 
+0

それは約束されているに変換されますが、それはうまく動作していません..そして、私はそこで働いているコールバックfuctionsで試してみます – hardy

関連する問題