简体   繁体   中英

Node.js: TypeError: Object socket.io has no method 'listen'

I'm making a little Node app using socket.io 0.9.13 using Express 3.0.6. I can't seem to anything even starting to run because it says socket.io has no method listen() . Here's my code (compiled coffeescript, so it's a bit ugly):

(function() {
  var app, express, io, port, usernames;

  express = require('express');

  app = express();

  io = require('socket.io'.listen(3000));

  port = 3000;

  app.listen(port);

  console.log("Listening on port " + port);

  console.log('CNTRL-C to quit.');

  app.engine('hamlc', require('haml-coffee'.__express));

  app.get('/', function(request, response) {
    return response.render('index.hamlc');
  });

  usernames = {};

  io.sockets.on('connection', function(socket) {
    socket.on('send-chat', function(msg) {
      return io.sockets.emit('update-chat', socket.username, msg);
    });
    socket.on('add-user', function(username) {
      socket.username = username;
      usernames[username] = username;
      socket.emit('update-chat', 'SERVER', "You have connected as " + username + ".");
      socket.broadcast.emit('update-users', 'SERVER', "" + username + " has joined the chat.");
      return io.sockets.emit('update-users', usernames);
    });
    return socket.on('disconnect', function() {
      delete usernames[socket.username];
      io.sockets.emit('update-users', usernames);
      return socket.broadcast.emit('update-chat', 'SERVER', "" + socket.username + " has disconnected from chat");
    });
  });

}).call(this);

Which raises the following error:

node.js:201
        throw e; // process.nextTick error, or 'error' event on first tick
              ^
TypeError: Object socket.io has no method 'listen'
    at Object.<anonymous> (/Users/chris/src/web/kouv/app.js:8:28)
    at Object.<anonymous> (/Users/chris/src/web/kouv/app.js:44:4)
    at Module._compile (module.js:432:26)
    at Object..js (module.js:450:10)
    at Module.load (module.js:351:31)
    at Function._load (module.js:310:12)
    at Array.0 (module.js:470:10)
    at EventEmitter._tickCallback (node.js:192:40)

Answer appreciated greatly. :-)

Try this:

var express = require('express'),
    http = require('http');

var app = express();
var server = http.createServer(app);

var io = require('socket.io').listen(server);
server.listen(3000);

Socket.io essentially hijacks the http object when it runs; express 3.xx no longer runs off the http.server though, so it's necessary to create your own instance of it for socket.io to use.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM