【问题标题】:Can't connect to my WebSocket from within my Angular2 app无法从我的 Angular2 应用程序中连接到我的 WebSocket
【发布时间】:2016-07-02 15:33:25
【问题描述】:

嘿嘿。

我有一个使用 Node.js/Electron/Angular2 (TypeScript) 的应用程序。使用 socket.io 我创建了一个 WebSocket。只要我不在 Angular2 应用程序中,一切正常。

我尝试了一整天来让它运行,但没有运气。我下载了一个工作教程,但找不到丢失的链接。快把我逼疯了!

  • 这是我的electron.js 启动应用程序,创建 websocket 服务器端
  • 这是我的index.html,带有工作 websocket,但作为原生 JavaScript 代码
  • 这是我的 Angular2 的 root component 试图让 websocket 运行

错误 - 不会停止编译 - 我得到的是 root.component.ts(14,17): error TS2304: Cannot find name 'io'.

我怎样才能摆脱这个错误?或者更好:Angular2 中这种 websocket 通信的最佳实践是什么?

提前致谢。

【问题讨论】:

    标签: javascript node.js websocket socket.io angular


    【解决方案1】:

    现在我用这种方式解决了这个问题:

    1. 安装了socket.io-client类型$ tsd install socket.io-client
    2. 添加了对我的 main.ts 文件 ///<reference path="../../typings/socket.io-client/socket.io-client.d.ts"/> 的类型引用。
    3. 安装了socket.io-client Node.js模块$ npm install --save socket.io-client
    4. 将此模块添加到我的 index.html <script src="../node_modules/socket.io-client/socket.io.js"></script>

    现在我可以简单地使用任何 Angular2 组件中的套接字,而无需添加任何额外的行。

    socket = null;
    
    constructor() {
        this.socket = io('http://localhost:8181');
        this.socket.on('news', function (data) {
            console.log(data);
        });
    }
    

    作为参考,这是我的主 Electron .js 文件中的服务器套接字代码:

    var server = require('http').createServer(function(req, res) {})
        socket = require('socket.io')(server, {});
    
    server.listen(8181);
    
    socket.on('connection', function(socket) {
        socket.emit('news', {hello: 'world'});
        socket.on('my other event', function(data) {
            console.log(data);
        });
    });
    

    希望这对以后的任何人都有帮助。感谢 Thierry Templier 和 dvlsg 的帮助。

    【讨论】:

      【解决方案2】:

      我会注意到,如果您使用的是 electron,那么您不应该真的将 electron.js 视为服务器端。它更像是一个客户端启动器/引导程序,并且必须在每个客户端上运行。您必须有一个单独的节点应用程序(我强烈建议您这样做,在 socket.io 的情况下)才能真正使您的代码服务器端。

      至于您的问题,您可以尝试在根组件中添加import io from 'socket.io-client'var io = require('socket.io-client')(如果需要,在npm install socket.io-client 之后)。

      【讨论】:

      • 感谢 dvlsg。这只是一个桌面应用程序,我需要 Angular2 与 Electron 进行通信,有人告诉我,Web 套接字在这里很有意义,可以保持客户端/服务器分离。
      • 啊。抱歉,我错过了您使用 Typescript。我将删除此答案,因为它与您的问题无关。
      • 实际上,暂且不谈——我相信我和蒂埃里关于使用import 的建议也可以使用,而无需在您的 index.html 中添加<script> 标记,并且可能是首选包含模块的方式(至少避免添加到全局范围)。您可能还想研究一下 electron 内置的 IPC style messaging,因为 Electron 有一个用于渲染器/主通信的本机解决方案。
      • IPC 是一个很好的提示。但是我仍然在为让模块在我的 TypeScrip Angular2 应用程序中工作的逻辑而苦苦挣扎。现在我只是想在我的root.component 构造函数中执行这个ipcRenderer.send('asynchronous-message', 'ping');,没有运气。使用上述import 功能的最佳方法是什么?
      • 好问题。我相信const ipcMain = require('electron').ipcMain; 会转化为import { ipcMain } from 'electron'。不过,这可能是也可能不是您需要的,这取决于您拥有的electron 版本。您可能还需要查看电子类的 tsd 类型——this 可能对您有帮助。
      【解决方案3】:

      您需要使用以下命令安装 socket.io 类型(请参阅此链接:https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/socket.io/socket.io.d.ts):

      $ tsd install socket.io
      

      然后你需要导入它:

      import * as io from 'socket.io';
      

      【讨论】:

      • 谢谢蒂埃里。 $ tsd install socket.io 工作。但是我不应该使用socket.io-client 吗?虽然,两种方式都行不通。我的 root.component 在编译时不再抛出任何 TypeScript 错误,但电子控制台显示 GET file:///Users/hoferma/Projects/sharktank-desktop/source/socket.io-client net::ERR_FILE_NOT_FOUND。我错过了什么?
      • 我认为你修复了编译部分...这个错误在运行时出现在哪里?
      • 尝试与套接字对话时出现。我同时解决了这个问题。无论如何,感谢您的出色帮助。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-05
      • 2020-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-10
      • 2018-04-18
      相关资源
      最近更新 更多