[문제]
분명 Front-End 에서는 Back-End 로부터 Mono 데이터 하나를 받았는데 Promise 의 onComplete 이벤트가 발생하지 않았다. Front-End 의 코드와 Back-End 코드는 각각 다음과 같다.
async requestResponse(to: string, message: Message) {
await this.connect();
return new Promise((resolve, reject) => {
this.client &&
this.client.requestResponse(
{
data: cbor.encode(message),
metadata: encodeRoute(to),
},
{
onError: (error: Error) => {
console.error('[*] oneToOne error : ', error);
reject(error);
},
onNext: (payload: Payload, isComplete: boolean) => {
console.log(
`[*] oneToOne next : ${cbor.decode(
payload.data as Buffer,
)} | ${isComplete}`,
);
},
onComplete: () => {
console.log('[*] 데이터 송신 완료');
resolve(null);
},
onExtension: () => {},
},
);
});
}
RSocket 의 requestResponse 프로토콜로 서버에 데이터를 전송하고 받는 코드이다.
그런데 onNext 만 이벤트가 발생하고 onComplete 가 발생하지 않는 것이다.
@MessageMapping("chat.send")
public Mono<Boolean> sendChatMessage(@Payload Message messageRequest) {
return chatRoomRepository.saveMessage(
messageRequest.getRoomId(),
messageRequest.getFromPerson(),
messageRequest.getMessage()).log();
}
서버코드는 간결하다.
redis 에 데이터를 저장하고 결과 값을 Boolean 형태로 전송한다.
[원인]
Mono onComplete order is confusing · Issue #1752 · reactor/reactor-core (github.com)
중간 부분 댓글을 보면 Mono.subscribe 를 호출할 때, onComplete 이벤트는 발생하지 않고 onNext 가 그 역할까지 대신한다는 내용이 보인다. onComplete 를 호출하지 않고 onNext 에서 끝낸다는 것이다.
클라이언트 코드에서 onComplete 일 때 resolve 함수를 호출하므로 onNext 에서 resolve 함수를 호출하여 문제를 해결하였다.
'개발일지 > 에러' 카테고리의 다른 글
[Typescript] Cannot find module 'X' Error in TypeScript (0) | 2022.10.08 |
---|---|
[Typescript] Type X must have a '[Symbol.iterator]()' method that returns an iterator (1) | 2022.10.05 |
[React] Reference Error: Buffer is not defined (0) | 2022.09.19 |