react-native中使用SockJs和StompJs
本文梳理在使用过程中遇到的坑点(Android)
开始使用
package.json
{ |
然后在App.js中使用
//引入SockJs和 Stompjs |
产生问题
然后在android设备中调试 react-native run-android
不出意外启动你的App后你会看到以下场景
**根据出错信息推断,应该是js的参数映射到java方法的形参上出现了类型转换错误 **
接着跟着App提示的信息调试代码
从图中我们可以看出,该方法的参数列表应该使我们实例化SockJs传入的url
再观察图中的traceName 映射到ReactNative
Networking
模块中的sendRequet
方法
查看NetworkingModule(该模块实现了js中的XMLHttpRequest
接口)源码发现,最后一个参数的类型为boolean
|
然而我们实际参数为["GET","http://192.168.0.101:8080/wechat-custom-msg/info?t=1521610071602",1,[],{"trackingName":"unknown"},"text",true,0,"true"]
很明显最后一个参数是一个字符串,所以导致了解析参数时
出现的java.lang.String cannot be cast to java.lang.Boolean
可以推断是SockJs发起了XHR请求导致App出现了这个问题
最后找到SockJs中的abstract-xhr.js源码
if ((!opts || !opts.noCredentials) && AbstractXHRObject.supportsCORS) { |
很明显问题就出在这儿。
查看mozilla官网中对XMLHttpRequest的[API][b409798c]描述
The XMLHttpRequest.withCredentials property is a Boolean that indicates whether or not cross-site Access-Control requests should be made using credentials such as cookies, authorization headers or TLS client certificates. Setting withCredentials has no effect on same-site requests.
如何解决
this.xhr.withCredentials = true; |
- 将
"true"
改为Boolean类型的true
- 或者到
你的项目路径/node_modules/sockjs-client
目录中使用gulp
重新编译
找到sockjs
[b409798c]: https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/withCredentials “API”