Gefangen
Swlaaa
2018-08-07 03:51
采纳率: 100%
浏览 1.2k

JSON字符串消息转换成Javascript的对象出错

我在写一个服务,想解决angular本地代理解决跨越问题,但是不知道为什么,在将JSON字符串消息转换成Javascript的对象时出错了。下面时是我的代码

 const server = app.listen(8000, "localhost", () => {
    console.log("服务器已启动,地址是:http://localhost:8000");
});

const subscriptions = new Map<any,number[]>();

const wsServer = new Server({port:8085});
wsServer.on("connection",websocket =>{
    websocket.send('这个消息是服务器主动推送的');
    websocket.on('message', message => {
        let messageObj = JSON.parse(message);  //这里报错了
        let productIds = subscriptions.get(websocket) || [];
        subscriptions.set(websocket, [...productIds,messageObj.productId]);
    });
});

图片说明

当我的angular项目从localhost:4200连接到localhost:8000时报错
图片说明

图片说明

控制台
图片说明

编译器为vscode

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

11条回答 默认 最新

  • SmallYard
    SmallYard 2018-08-07 05:53
    已采纳

    可以首先console.log(message);看下它的值是什么,如果返回的是json对象,就不需要进行转换了,直接使用。如果是数组那你先转换成json字符串JSON.stringify()之后然后在进行JSON.parse(); 说到底还是得看返回的massage是什么

    点赞 评论
  • leng19930326
    WilliamXIII 2018-08-07 04:04

    编码的问题,你的中文编码识别不了,需要转换中文编码

    点赞 评论
  • leng19930326
    WilliamXIII 2018-08-07 04:06

    你可以用英文试一下,转为UTF-8或者Unicode的编码

    点赞 评论
  • xcgh
    xcgh 2018-08-07 05:30

    返回的json是字符串,不是json对象,可以服务端修改,返回json对象,或者客户端使用eval转换一下
    http://www.cnblogs.com/hgmyz/p/7451461.html

    点赞 评论
  • a1024271896
    Ⅶ宗罪 2018-08-07 06:48

    你这返回的应该直接就是一个字符串类型,你可以在后台将他用JSONObject来包装一下,或者在前台直接用这个就可以

    点赞 评论
  • qq_34272143
    浮华蒲公英 2018-08-07 07:12

    字符编码需要注意下,字符串需要转换的

    点赞 评论
  • hmrhmr1027
    猫猫绒 2018-08-07 08:09

    返回的message,不能json.parse(),一般也就跟上面的几位说的一样,是message的问题。这里你可以打开浏览器的Network功能,找到对应的ajax请求,找到返回的message数据,用在线json转换(随便百度搜一个),把数据扔进去,json转换一下,看下是怎么报错的。针对错误,去修改返回的message,直达可以json转换。
    这个问题,是后台数据问题。

    点赞 评论
  • Gefangen
    Swlaaa 2018-08-07 12:34

    因为原则上message是以字符串发出的,所以我是在客户端将message对象转为字符串,然后在服务端接到之后在将字符串转回JSON对象,以下是我在客户端的代码

     import { Injectable } from '@angular/core';
    import { Observable } from 'rxjs';
    import 'rxjs/Rx';
    
    @Injectable()
    export class WebSocketService {
      ws:WebSocket;
    
      constructor() { }
    
      createObservableSocket(url:string, id:number) : Observable<any>{
        this.ws = new WebSocket(url);
        return new Observable<string>(
          observer =>{
            this.ws.onmessage = (event) => observer.next(event.data);
            this.ws.onerror = (event) => observer.error(event);
            this.ws.onclose = (event) => observer.complete();
            this.ws.onopen = (event) => this.sendMessage({productId:id});  //send的是一个对象
          }
        ).map(message => {JSON.parse(message)});
      }
    
      sendMessage(message:any){  //any表示send什么类型都可以
        this.ws.send(JSON.stringify(message));   //但原则上message是一个字符串,所以将message对象转为字符串发出去
      }
    
    }
    
    点赞 评论
  • qq_15002353
    someday0898 2018-08-09 11:49

    是不是json没有序列化的问题,需要把Json格式序列化为json对象结构体

    点赞 评论
  • zhaomin_g
    _zming 2018-08-16 04:41

    json不合法,看下具体json便知

    点赞 评论
  • clopactra
    clopactra 2018-11-18 08:13

    websocket.send('这个消息是服务器主动推送的');, 把这个去掉就好用了

    点赞 评论

相关推荐