我在写一个服务,想解决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
可以首先console.log(message);看下它的值是什么,如果返回的是json对象,就不需要进行转换了,直接使用。如果是数组那你先转换成json字符串JSON.stringify()之后然后在进行JSON.parse(); 说到底还是得看返回的massage是什么
编码的问题,你的中文编码识别不了,需要转换中文编码
你可以用英文试一下,转为UTF-8或者Unicode的编码
返回的json是字符串,不是json对象,可以服务端修改,返回json对象,或者客户端使用eval转换一下
http://www.cnblogs.com/hgmyz/p/7451461.html
你这返回的应该直接就是一个字符串类型,你可以在后台将他用JSONObject来包装一下,或者在前台直接用这个就可以
字符编码需要注意下,字符串需要转换的
返回的message,不能json.parse(),一般也就跟上面的几位说的一样,是message的问题。这里你可以打开浏览器的Network功能,找到对应的ajax请求,找到返回的message数据,用在线json转换(随便百度搜一个),把数据扔进去,json转换一下,看下是怎么报错的。针对错误,去修改返回的message,直达可以json转换。
这个问题,是后台数据问题。
因为原则上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对象转为字符串发出去
}
}
是不是json没有序列化的问题,需要把Json格式序列化为json对象结构体
json不合法,看下具体json便知
websocket.send('这个消息是服务器主动推送的');, 把这个去掉就好用了