rxjs: rxjs/webSocket SyntaxError: Unexpected token s in JSON at position 0

Bug Report

Current Behavior using string urlConfigOrSource generates SyntaxError: Unexpected token s in JSON at position 0 with WebSocketSubjectConfig and defined deserializer function error does not appear.

Reproduction

    this.pubsubSubject = webSocket('ws://localhost:8080');
    this.pubsubSubject.subscribe(
      (msg) => console.log('message received: ' + msg),
      (err) => console.log(err),
      () => console.log('complete')
    );

throws error

SyntaxError: Unexpected token s in JSON at position 0
    at JSON.parse (<anonymous>)
    at deserializer (WebSocketSubject.js:12)
    at tryCatcher (tryCatch.js:6)
    at WebSocket.socket.onmessage [as __zone_symbol__ON_PROPERTYmessage] (WebSocketSubject.js:174)
    at WebSocket.wrapFn (zone.js:1188)
    at ZoneDelegate.push../node_modules/zone.js/dist/zone.js.ZoneDelegate.invokeTask (zone.js:421)
    at Object.onInvokeTask (core.js:3811)
    at ZoneDelegate.push../node_modules/zone.js/dist/zone.js.ZoneDelegate.invokeTask (zone.js:420)
    at Zone.push../node_modules/zone.js/dist/zone.js.Zone.runTask (zone.js:188)
    at ZoneTask.push../node_modules/zone.js/dist/zone.js.ZoneTask.invokeTask [as invoke] (zone.js:496)

to fix this we need use:

this.pubsubSubject = webSocket({
    url: 'ws://localhost:8080',
    deserializer: () => {}
});

after that this.pubsubSubjectsubscribe() doesn’t throw error

Environment

  • Runtime: @angular 6.1.8 chrome 69.0.3497.100
  • RxJS version: 6.3.2
  • angular-cli 6.2.3,

About this issue

  • Original URL
  • State: closed
  • Created 6 years ago
  • Reactions: 1
  • Comments: 16 (10 by maintainers)

Most upvoted comments

By default webSocketSubject is trying to deserialize the message by applying JSON.parse(). If you message is not an string is going to fail (the error you are getting now). Now when you tell to webSocket to use this deserializer () => {}, you are telling it, just give me back an undefined value (Since it is returning nothing).

Here you have two options,

  1. use JSON.stringify on the server or any other tool to make the message an string.
  2. use a custom deserializer but not forget to get your data back. 😄

Example: Here you can apply whatever transformation you want. I just not applying anything but avoiding the default behaviour (JSON.parse()). Since JSON.parse()attempts to transform an string to a JSON object and surely you are not expecting that type of data (an string coming from your server).

const WebSocketSubject = webSocket({
    url: 'ws://localhost:3200',
    deserializer: msg => msg
});

This seems like it was just a debugging session. Closing.

@luillyfe it works in this way, thanks.