1

我是 Node-Red 和 socket.io 的新手。我想构建一个自定义节点作为从服务器接收 socket.io 消息的客户端。我称它为 socketi,因为它只是输入。该节点开始运行,使连接正常,但是当我将数据从另一个客户端发送到服务器到部署的 Node-Red 流时崩溃。这是节点的js:

module.exports = function(RED) {
  "use strict";
  var socket = require("socket.io-client");
  var io = require("socket.io-client");
  function socketiNode(config) {
    RED.nodes.createNode(this,config);
    var node = this;
    socket = io.connect('http://192.168.2.3:8080');
    socket.on('mouse',
        function(data) {
            // When we receive data
            this.warn([ data.x , data.y ]);
            this.send([ data.x , data.y ]);
         }
     );
  }
 RED.nodes.registerType("socketi",socketiNode);
}

经过反复试验,我发现当我需要“socket.io-clinet”而不是“socket.io”的变量时建立了连接。它仍然需要其他模块,所以我在 node_modules 文件夹中有以下内容:

/node_modules
  /debug
  /engine.io
  /has-binary-data
  /socket.io-adapter
  /socket.io-client
  /socket.io-parser

我有 socket.io 服务器和另一个在 Mac 上运行的客户端,并且 Node-Red 流部署在 Raspberry Pi 2 上,都是本地的。以下是我运行 Node-Red 时发生的情况:

    pi@raspberrypi ~ $ node-red-pi --max-old-space-size=128 -v


    Welcome to Node-RED
    ===================

    2 Aug 19:58:22 - [info] Node-RED version: v0.11.1
    2 Aug 19:58:22 - [info] Node.js  version: v0.12.0
    2 Aug 19:58:22 - [info] Loading palette nodes
    2 Aug 19:58:32 - [info] Settings file  : /usr/local/lib/node_modules/node-red/settings.js
    2 Aug 19:58:32 - [info] User directory : /home/pi/.node-red
    2 Aug 19:58:32 - [info] Flows file : /home/pi/.node-red/flows_raspberrypi.json
    2 Aug 19:58:32 - [info] Server now running at http://127.0.0.1:1880/
    2 Aug 19:58:32 - [info] Starting flows
    2 Aug 19:58:32 - [info] Started flows
    2 Aug 19:58:41 - [info] Stopping flows
    2 Aug 19:58:41 - [info] Stopped flows
    2 Aug 19:58:41 - [info] Starting flows
    2 Aug 19:58:41 - [info] Started flows
    2 Aug 19:59:36 - [red] Uncaught Exception:
    2 Aug 19:59:36 - TypeError: undefined is not a function
    at Socket.<anonymous> (/home/pi/.node-red/nodes/node-red-node-socketi/socketi.js:12:22)
    at Socket.Emitter.emit (/home/pi/.node-red/nodes/node-red-node-socketi/node_modules/socket.io-client/node_modules/component-emitter/index.js:134:20)
    at Socket.onevent (/home/pi/.node-red/nodes/node-red-node-socketi/node_modules/socket.io-client/lib/socket.js:254:10)
    at Socket.onpacket (/home/pi/.node-red/nodes/node-red-node-socketi/node_modules/socket.io-client/lib/socket.js:212:12)
    at Manager.<anonymous> (/home/pi/.node-red/nodes/node-red-node-socketi/node_modules/socket.io-client/node_modules/component-bind/index.js:21:15)
    at Manager.Emitter.emit (/home/pi/.node-red/nodes/node-red-node-socketi/node_modules/socket.io-client/node_modules/component-emitter/index.js:134:20)
    at Manager.ondecoded (/home/pi/.node-red/nodes/node-red-node-socketi/node_modules/socket.io-client/lib/manager.js:301:8)
    at Decoder.<anonymous> (/home/pi/.node-red/nodes/node-red-node-socketi/node_modules/socket.io-client/node_modules/component-bind/index.js:21:15)
    at Decoder.Emitter.emit (/home/pi/.node-red/nodes/node-red-node-socketi/node_modules/socket.io-parser/node_modules/component-emitter/index.js:134:20)
    at Decoder.add (/home/pi/.node-red/nodes/node-red-node-socketi/node_modules/socket.io-parser/index.js:247:12)
    pi@raspberrypi ~ $ 

19:59:36 是我将数据从客户端发送到服务器到 Node-Red 的地方。似乎很清楚我需要更多模块,即使我认为我应该只需要客户端代码。也许我只是缺少一些简单的东西?

4

1 回答 1

0

this中的不会function(data)指向节点对象而是套接字回调对象。尝试进行此更改:

...
var node = this;
socket = io.connect('http://192.168.2.3:8080');
socket.on('mouse',
    function(data) {
        // When we receive data
        node.warn([ data.x , data.y ]);
        node.send([ data.x , data.y ]);
     }
 );
 ...
于 2015-08-03T08:41:27.910 回答