【发布时间】:2021-09-21 15:22:19
【问题描述】:
我得到了一个 Ionic + Capacitor 应用程序,该应用程序将主要编译为在 Android 平台上运行。我的任务是将与远程 ActiveMQ 代理的通信集成到应用程序中。我使用 STOMP JS 库来实现这一点,并且当我在浏览器上测试它时效果非常好。现在,当我在模拟器上进行测试时,应用程序无法连接到 ActiveMQ 代理。我相信这是因为浏览器支持开箱即用的 WebSockets,而模拟器无法理解 WS URL。我在网上看到我可以使用 SockJS 作为一个简单的解决方案,并且可以很容易地集成到我当前的代码中。我指的是下面的教程:
https://stomp-js.github.io/guide/stompjs/rx-stomp/ng2-stompjs/using-stomp-with-sockjs.html
但是,当我按照说明添加教程中提供的后备代码时,我收到了 Typescript 编译器抛出的奇怪错误。我的代码如下:
import {Client, Message, ActivationState, messageCallbackType} from '@stomp/stompjs'
//import StompJs, { Message } from '@stomp/stompjs';
import { Queue } from 'queue-typescript';
import SockJS from 'sockjs-client';
const brokerEndpoint = "ws://localhost:61614";
//const brokerEndpoint = "ws://10.0.2.2:61614";
const items: string[] = [];
const queue = new Queue<string>(...items);
const createClient = () => {
const client: Client = new Client({
brokerURL: brokerEndpoint,
connectHeaders: {
login: 'admin',
passcode: 'admin',
},
debug: function (str) {
console.log(str);
},
reconnectDelay: 1000,
heartbeatIncoming: 0,
heartbeatOutgoing: 0
});
client.webSocketFactory = new SockJS('http://localhost:61613/stomp');
/*
if (typeof WebSocket !== 'function') {
console.log("Not WebScoket");
// For SockJS you need to set a factory that creates a new SockJS instance
// to be used for each (re)connect
client.webSocketFactory = function () {
// Note that the URL is different from the WebSocket URL
return new SockJS('http://10.0.2.2:15674/stomp');
};
} else {
console.log("Still using websockets");
}
*/
return client;
}
const client: Client = createClient()
下面这行是抛出错误的地方:
client.webSocketFactory = new SockJS('http://localhost:61613/stomp');
编译器说“类型 'WebSocket' 不能分配给类型 '() => IStompSocket'。 类型 'WebSocket' 与签名 '(): IStompSocket' 不匹配。”
根据教程,看来我做对了。但是,Typescript 似乎认为存在一些不兼容。有没有人使用过 SockJS + STOMP 或我导入的任何库,并让它成功运行?任何线索将不胜感激!
【问题讨论】:
-
您在 Ionic 项目中使用 Angular 吗?你使用
stomp-js(@stomp/ng2-stompjs) 的 Angular 实现吗? -
@DanilProkhorenko:实际上这个应用程序使用的是 Vue,而不是 Angular。我猜同一个库不能用于此目的?而且,我正在使用 stompjs [link] (github.com/stomp-js/stompjs) 的正常实现。事实上,我愿意使用其他协议连接到 ActiveMQ。只是根据我的研究,STOMP 最有意义
-
嗯...我对vue不熟悉。你检查过这个:stomp-js.github.io/guide/stompjs/rx-stomp/ng2-stompjs/… 吗?
-
@DanilProkhorenko:是的,我做到了。但是,由于我的浏览器支持 Websockets,我不确定它是否适用于我。只是当这个 Ionic 应用程序为 Android 平台编译时,它无法工作,因为它无法理解 WS URL。 SockJS 似乎可以解决这个问题。但是,我无法使用 SockJS 连接到代理。你有使用 SockJS 或任何其他类似库的经验吗?我也愿意改变我的整个方法。只需要能够从我的 Ionic ap 连接到 ActiveMQ 代理(来自 Android 和浏览器)。
-
我不熟悉
SockJS,但我认为您的问题与缺少类型定义或某些全局设置有关。你能试着找到出现问题的地方吗?另外,您可以尝试手动将类型转换为需要的类型。
标签: typescript ionic-framework stomp sockjs