2017-11-28 9 views
0

/api/v1/chatsPOST 경로에서 요청 본문에 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 형 메커니즘을 사용할 필요가

답변

0

. 따라서 bluebird과 같은 타사 라이브러리를 사용해야 할 수도 있습니다.

자세한 내용 bluebird mapSeries