내 /api/v1/chats
POST
경로에서 요청 본문에 user_id
이 전달 될 때마다 user_chat_queries.addUserChat
으로 비동기 호출을합니다.Knex 쿼리가 비동기 적으로 실행될 때 두 번 같은 레코드 삽입
비동기 경로 처리기 (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_id: 4, chat_id: 3 }
레코드는 user_chat
테이블에 삽입됩니다.
나는 이것을 일으키는 원인을 추적 할 수 없습니다. addUserChat
은 해결 시점과 관계없이 매번 전달되는 입력에서 만들어진 레코드를 삽입해야합니다.
전체 코드베이스 : https://github.com/caseysiebel/lang-exchange
디버깅 콘솔 출력 : https://gist.github.com/caseysiebel/262997efdd6467c72304ee783dadd9af#file-console-L5 당신이 (기본 약속의 API를 사용할 수 없습니다) mapSeries
형 메커니즘을 사용할 필요가