【问题标题】:io.on is not a functionio.on 不是函数
【发布时间】:2017-01-12 21:44:38
【问题描述】:

我有此代码用于从我的 Arduino 接收数据,但我想将数据发送回我的 Arduino 并在我的客户端页面上获得响应。我添加了一个监听功能,但是当我从客户端页面发送数据时,我不断收到io.on is not a function

test.js

io.listen(app.listen(3000)).on('connection', function (client) {

    // store client into array
    clients.push(client);

    // on disconnect
    client.on('disconnect', function() {

        // remove client from array
        clients.splice(clients.indexOf(client), 1);


    });

    // I added this to listen for event from my chart.JS

    io.on('connection', function(socket){

        socket.on('LED on', function (data) {
            console.log(data);

        });
        socket.on('LED off', function (data) {
            console.log(data);

        });
    });
});

【问题讨论】:

  • 不是您当前的问题,但您需要在document.getElementById('ON').onclick = ledOn(); 等行中去掉ledOn();ledOff(); 末尾的括号。这将立即调用这些函数并将它们的返回值 (undefined) 分配给 onclick。应该是document.getElementById('ON').onclick = ledOn;
  • 你使用什么库?你在哪个平台?什么是完整的堆栈跟踪/错误消息?
  • 那是一个http服务器应用?通常你会这样做var app = require('http').createServer(handler)var io = require('socket.io')(app);app.listen(PORT)io.on('connection', function (socket) { //...
  • @robertotomás 我的 socket.io 已经在监听这个函数的事件了。我只是想发回数据。您真的需要包含所有这些吗?
  • 使用 express.js 设置 socket io,见socket.io/docs/#Using-with-Express

标签: javascript node.js socket.io arduino


【解决方案1】:

io 的值不是应有的值。

通常的做事方式是这样的:

var app = require('http').createServer(handler)
var io = require('socket.io')(app);
var fs = require('fs');

app.listen(80);

io.on('connect', ...);

但我猜你io 的值是这样的:

var io = require('socket.io');

这不是一回事。那是模块句柄。但是,当你这样做时:

var io = require('socket.io')(app);

那么,io 是一个 socket.io 实例。您可以将侦听器绑定到实例,而不是模块句柄。


this doc page 上的每个 socket.io 服务器端示例中,它们都使用以下形式之一:

var io = require('socket.io')(app);
var io = require('socket.io')(port);
var io = require('socket.io')(server);

用这个:

 io.on('connection', ....);

他们无处可做:

var io = require('socket.io`);
io.listen(server);
io.on('connection', ....);

这只是 io 的错误值。


长话短说,您需要修复分配给 io 的内容以与文档保持一致。这是来自require('socket.io')(app); 的返回值,它为您提供了一个 socket.io 实例对象,然后您可以在该对象上设置事件处理程序。

【讨论】:

  • 感谢回复。你完全正确。但是,我得到了一个已经有效的结构。它通过以太网连接到我的 Arduino,并使用 Socket.IO 将我的传感器数据存储在我的 MongoDB 中。您认为添加上述内容会搞砸吗?我可以提供一个 JSfiddle 链接,以便您了解我得到了什么以及我是如何实现这一目标的。
  • @Ekom - 以正确的方式做事不会把事情搞砸,所以我真的不知道该如何回应。
  • @Ekom - 如果您写的特定错误现在已解决,您应该结束这个问题,因为我们不想继续在原始问题中添加后续问题。如果您仍然卡住,您可以在新问题中发布更多相关代码,描述您已完成的所有相关调试以及您发现的线索,然后在新问题中寻求下一个问题的帮助。跨度>
  • 好的!我已经发布了另一个问题。感谢您的input
  • 请帮我拍一张look
【解决方案2】:

如果您使用的是快递

var express = require('express');
var app = express();
var server   = require('http').Server(app);
var io       = require('socket.io')(server);

let APP_PORT=3000;

server.listen(APP_PORT,()=>{
    console.log(`SERVER RUNNING ON PORT : ${APP_PORT}`);
});

io.on('connection', (socket) => {

       /* SOCKET - CORE EVENTS  */

       socket.on('connect', (message) => {
          console.log("connected: " + message+"socket_id:"+socket.id);
       });

       socket.on('disconnect',(data)=>{
          console.log('user disconnected:' + socket.id);
       });

       socket.on('error', function (err){
          console.log('received error from client:', socket.id,' Error :',err);
       });
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-28
    • 1970-01-01
    • 2014-08-07
    • 2022-08-13
    • 1970-01-01
    • 1970-01-01
    • 2021-09-26
    • 2016-02-15
    相关资源
    最近更新 更多