【问题标题】:Node.js: TypeError: Object socket.io has no method 'listen'Node.js:TypeError:对象 socket.io 没有方法“听”
【发布时间】:2013-01-25 00:34:22
【问题描述】:

我正在使用 Express 3.0.6 使用 socket.io 0.9.13 制作一个小 Node 应用程序。我似乎什么也没有开始运行,因为它说socket.io 没有方法listen()。这是我的代码(编译的coffeescript,所以有点难看):

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

这会引发以下错误:

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)

非常感谢您的回答。 :-)

【问题讨论】:

    标签: javascript node.js express socket.io


    【解决方案1】:

    试试这个:

    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 本质上是在运行时劫持了 http 对象; express 3.xx 不再在 http.server 上运行,因此有必要创建自己的实例供 socket.io 使用。

    【讨论】:

    • 啊...我明白了。 require 'socket.io'.listen(server) 正在编译为 require('socket.io'.listen(server))
    • @beakr 我猜@ari 的意思是express = require('express'); 而不是http = require('http');
    • 是的,你是对的!对不起。顺便问一下,var = express() 到底做了什么?
    • @Homero github.com/visionmedia/express/blob/master/lib/express.js。见第 17 和 32-39 行。 createApplication 函数暴露在第 17 行,所以当 express() 被调用时,它正在运行第 32-39 行(设置连接等),将其保存到变量 app 中,然后返回存储在变量中应用程序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-16
    • 1970-01-01
    • 1970-01-01
    • 2013-04-02
    • 2012-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多