Ekom
Ekom

Reputation: 629

io.on is not a function

I have this code working for receiving data from my Arduino but I will like to send data back to my Arduino and get a response on my client page. I added a listening function but I keep getting io.on is not a function when I send data from my client page.

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);

        });
    });
});

Upvotes: 9

Views: 34486

Answers (2)

Saurabh Mistry
Saurabh Mistry

Reputation: 13689

if you are using express

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);
       });
});

Upvotes: 0

jfriend00
jfriend00

Reputation: 708106

Your value of io is not what it should be.

The usual way of doing things is like this:

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

app.listen(80);

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

But I'm guessing that your value of io is something like this:

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

That's not the same thing. That's the module handle. But, when you do it this way:

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

Then, io is a socket.io instance. You can bind listeners to an instance, not to the module handle.


In every single socket.io server-side example on this doc page, they use one of these forms:

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

with this:

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

Nowhere do they do:

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

That's just the wrong value for io.


Long story, shortened, you need to fix what you assign to io to be consistent with the docs. It's the return value from require('socket.io')(app); that gives you a socket.io instance object that you can then set up event handlers on.

Upvotes: 20

Related Questions