2016-02-29 10 views
12

現在、Nodejs、Express、Sequelize(PostgreSQL)アプリケーションを構築中です。トランザクションとループと共に約束を使用する際にいくつかの問題があります。Sequelizeでのトランザクションでのループと約定の使用

私はトランザクションでforループを使用する方法を理解しようとしています。私は、メンバーのリストをループし、それぞれのデータベースの新しいユーザーを作成しようとしています。

私は次のコードが間違っていることを知っていますが、私がしようとしていることを示しています。

誰でも正しい方向に向けることができますか?私はそれが取引上のキャッチにフォーマットするための

申し訳ありませんが飛び出すと思うよう

 var members = req.body.members; 
     models.sequelize.transaction(function (t) { 
      for (var i = 0; i < members.length; i++) { 
       return models.User.create({'firstname':members[i], 'email':members[i], 'pending':true}, {transaction: t}).then(function(user) { 
        return user.addInvitations([group], {transaction: t}).then(function(){}).catch(function(err){return next(err);}); 
       }) 
      }; 
     }).then(function (result) { 
      console.log("YAY"); 
     }).catch(function (err) { 
      console.log("NO!!!"); 
      return next(err); 
     }); 

答えて

19

あなたは、私は信じていませんPromise.all

var members = req.body.members; 
    models.sequelize.transaction(function (t) { 
     var promises = [] 
     for (var i = 0; i < members.length; i++) { 
      var newPromise = models.User.create({'firstname':members[i], 'email':members[i], 'pending':true}, {transaction: t}); 
      promises.push(newPromise); 
     }; 
     return Promise.all(promises).then(function(users) { 
      var userPromises = []; 
      for (var i = 0; i < users.length; i++) { 
       userPromises.push(users[i].addInvitations([group], {transaction: t}); 
      } 
      return Promise.all(userPromises); 
     }); 
    }).then(function (result) { 
     console.log("YAY"); 
    }).catch(function (err) { 
     console.log("NO!!!"); 
     return next(err); 
    }); 

あなたはsequelize取引内catchする必要が使用する必要があります。モバイル上。

すべての約束は返却(または失敗)するためPromise.allが.thenを実行する前に待機します、と.thenコールバックはあなたがループ構造で構築を使用する必要があり、各配列

+0

お返事ありがとうございますが、トランザクションに約束を返す必要があることを伝えるエラーが表示されます。それぞれのPromise.allの前に "return"を追加しようとしましたが、 "未処理の拒否コミットがこのトランザクションで呼び出されました(fc7be023-1980-455e-9934-7816420daa2b)、もう使用できません" _ – ReturnToZero

+1

戻り値は何もuserPromisesにプッシュされません。 –

+0

@BenjaminGruenbaumありがとう私は昨日モバイルでこれをやったことがあり、戻ってきて、それをチェックする機会がありません。私ができるときに更新します。 – Datsik

4

からすべての約束のデータになりますブルーバードのsequelizeに付属:

var members = req.body.members; 
models.sequelize.transaction(t => 
    Promise.map(members, m => // create all users 
    models.User.create({firstname: m, email: m, 'pending':true}, {transaction: t}) 
).map(user => // then for each user add the invitation 
    user.addInvitations([group], {transaction: t}) // add invitations 
)).nodeify(err); // convert to node err-back syntax for express 
+0

また、とても洗練されたコードです。しかし、 '.nodeify(err);を得ることができませんでした。それはエラーが定義されていないと言います。前にnodeifyを使用していないので、おそらく何か不足しています。 – ReturnToZero

+0

nodeify(次へ)する必要があります - 申し訳ありません –

0

まず:https://caolan.github.io/async/docs.html

ので、簡単に:

// requiring... 
const async = require('async'); 

// exports... 
createAllAsync: (array, transaction) => { 
    return new Promise((resolve, reject) => { 
    var results = []; 
    async.forEachOf(array, (elem, index, callback) => { 
     results.push(models.Model.create(elem, {transaction})); 
     callback(); 
    }, err => { 
     if (err) { 
     reject(err); 
     } 
     else { 
     resolve(results); 
     } 
    }); 
    }); 
} 
+0

スタックオーバーフローへようこそ、答えを提供していただきありがとうございます。以下を確認してください:https://stackoverflow.com/help/how-to-answer – Daniel

関連する問題