2017-11-28 12 views
0

/api/v1/chatsPOSTルートでは、への非同期呼び出しを、要求本体でそれぞれuser_idに渡します。Knexクエリが非同期で実行されたときに同じレコードを2回挿入する

非同期ルートハンドラ(https://github.com/caseysiebel/lang-exchange/blob/master/src/server/routes/chats.js#L57)::アイデアはuser_id年代の多くは、私に来れば代わりに、私はそう私は非同期的に全ての挿入を派遣したいのですが、それぞれの挿入awaitを持ってしたくないということです

同期し
await Promise.all(user_ids.map((user_id) => { 
    return user_chat_queries.addUserChat(user_id, chat.id) 
})); 

とは反対に、

for (let user_id of user_ids) { 
    await user_chat_queries.addUserChat(user_id, chat.id) 
} 

そして中(https://github.com/caseysiebel/lang-exchange/blob/master/src/server/db/queries/user_chat.js#L5):今ルートは私のテストファイルからアクセスされる

addUserChat: (async (user_id, chat_id) => { 
    const user_chat = await userChats 
     .insert({ user_id, chat_id }) 
     .returning('*') 
    const data = await db('user_chat').select('*') 
    return user_chat; 
}), 

:(https://github.com/caseysiebel/lang-exchange/blob/master/test/routes.chats.test.js#L83

it('should add 2 user_chats', (done) => { 
    chai.request(server) 
     .post('/api/v1/chats') 
     .send({ 
      created_at: Date.now(), 
      user_ids: [ 2, 4 ] 
     }) 
     .end((err, res) => { 
      should.not.exist(err); 
      res.status.should.equal(201); 
      res.type.should.equal('application/json'); 
      res.body.status.should.eql('success'); 
      const chat = res.body.data; 
      chat.should.include.keys('id', 'created_at'); 

      knex('user_chat') 
       .select('*') 
       .then((data) => console.log('data', data)) 

      done(); 
     }); 
}); 

ログに{ user_id: 4, chat_id: 3 }二回user_chatテーブルに挿入されていることを示しています。

{ user_id: 2, chat_id: 3 }レコードの期待結果(および同期実行時の結果)は、user_chatテーブルに挿入されます。{ user_id: 4, chat_id: 3 }レコードが挿入されます。

原因を突き止めることはできません。 addUserChatは、いつ解決されるかにかかわらず、毎回渡される入力から作成されたレコードを挿入する必要があります。

完全なコードベース:コンソール出力をデバッグhttps://github.com/caseysiebel/lang-exchange

https://gist.github.com/caseysiebel/262997efdd6467c72304ee783dadd9af#file-console-L5

答えて

0

ます(デフォルトの約束のAPIには使用できません)mapSeriesタイプのメカニズムを使用する必要があります。だから、bluebirdのような他のサードパーティのライブラリを使う必要があるかもしれません。

詳細bluebird mapSeries

関連する問題