#javascript #angular #typescript #websocket #rxjs
#javascript #угловой #typescript #websocket #rxjs
Вопрос:
Используя rxjs websocket, я сталкиваюсь с проблемой при отправке данных.
Я всегда помещаю отправляемое сообщение в объект запроса, который выглядит следующим образом :
export class Request {
public constructor() { }
private t: string = null;
public get type(): string {return this.t;}
public set type(type: string) {this.t = type;}
private i: string = null;
public get issuer(): string {return this.i;}
public set issuer(issuer: string) {this.i = issuer;}
private n: string = null;
public get name(): string {return this.n;}
public set name(name: string) {this.n = name;}
private c: MyCandidateClass = null;
public get candidate(): MyCandidateClass {return this.c;}
public set candidate(candidate: MyCandidateClass) {this.c = candidate;}
private cis: { [id: string]: string; } = {};
public get credentialsInfo(): { [id: string]: string; } {return this.cis;}
public set credentialsInfo(credentialsInfo: { [id: string]: string; }) {this.cis = credentialsInfo;}
}
Объект построен, и мое cis
свойство представляет собой сопоставление ключ / значение, значение которого может быть, например {_PinCode: "1234"}
.
В моем объекте запроса все в порядке, но вот что на самом деле отправляется на сервер websocket :
{
cis: {},
c: candidate // <- an object of class MyCandidateClass as expected
i: "some_username",
n: "some_name",
t: "some_type"
}
Я теряю cis
объект.
Во время исследования я заметил, что если я создам класс CredentialsInfo
с правильными свойствами внутри и изменю свое cis
свойство Request
следующим образом :
private cis: CredentialsInfo = null;
public get credentialsInfo(): CredentialsInfo {return this.cis;}
public set credentialsInfo(credentialsInfo: CredentialsInfo) {this.cis = credentialsInfo;}
С этими изменениями он работает просто отлично.
Однако я хочу, чтобы моя cis
карта была отображением ключа / значения, как определено в моем первоначальном Request
, а не моем собственном определенном типе, поскольку я не всегда могу знать, какими будут ключи карты.
Я предполагаю, что это связано с сериализацией / десериализацией по умолчанию?
Как я могу этого добиться и выполнить начальную Request
работу?
Примечание: я использую Angular и rxjs, вот некоторые соответствующие части моего сервиса websocket :
import { webSocket, WebSocketSubject } from 'rxjs/webSocket';
// ...
ws: WebSocketSubject<any> = null;
// ...
connect(): void {
// ...
this.ws = webSocket(this.websocketUrl);
this.ws.subscribe(
(response) => this.onReceive(ResponseInfo.map(response)),
(err) => this.onError(err),
() => this.onClose('Complete (connection closed)')
);
// ...
}
send(request: RequestInfo): void {
// ...
this.ws.next(request);
}
// ...
Комментарии:
1. знаете ли вы, каковы возможные атрибуты cis, или вы хотите, чтобы он не был определен? кроме того, если вы измените тип ci (и получателя) на any, работает ли запрос так, как задумано?
2.
any
илиobject
тип тоже не работает. Я хочу, чтобы это было общим, поэтому я не знаю наверняка, какими могут быть атрибуты cis, я бы создал для него класс, если бы я это сделал.3. может быть, по какой-то причине он не может обрабатывать вложенные объекты, просто ради попытки, можете ли вы распространить (… cis) на ваш объект запроса и посмотреть, все ли свойства отправлены?