/api/v1/chats
POST
ルートでは、への非同期呼び出しを、要求本体でそれぞれ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