Socket.IO 错误“listen()”方法在迁移到 Express 3.0 后需要一个“http.Server”实例

Posted

技术标签:

【中文标题】Socket.IO 错误“listen()”方法在迁移到 Express 3.0 后需要一个“http.Server”实例【英文标题】:Socket.IO error 'listen()' method expects an 'http.Server' instance after moving to Express 3.0 【发布时间】:2012-09-27 16:16:12 【问题描述】:

我今天开始学习 Node.js,但我有点卡住了。

以this为例,当我尝试执行js文件时出现以下错误:

Warning: express.createServer() is deprecated, express
applications no longer inherit from http.Server,
please use:

  var express = require("express");
  var app = express();

Socket.IO's `listen()` method expects an `http.Server` instance
as its first parameter. Are you migrating from Express 2.x to 3.x?
If so, check out the "Socket.IO compatibility" section at:
https://github.com/visionmedia/express/wiki/Migrating-from-2.x-to-3.x
   info  - socket.io started

我不知道如何解决这个问题。

更新

比尔修改代码导致的错误:

/home/sisko/NodeJS/nodeSerialServer/serialServer.js:24
var app     =   express()
                ^
ReferenceError: express is not defined
    at Object.<anonymous> (/home/sisko/NodeJS/nodeSerialServer/serialServer.js:24:12)
    at Module._compile (module.js:449:26)
    at Object.Module._extensions..js (module.js:467:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Module.runMain (module.js:492:10)
    at process.startup.processNextTick.process._tickCallback (node.js:244:9)

【问题讨论】:

【参考方案1】:

简化为三行代码:

var server = require('http').createServer(require('express')()),
io = require('socket.io').listen(server);
server.listen(8080);

【讨论】:

【参考方案2】:

在版本 2 和 3 之间初始化 express 应用程序的方式发生了变化。此示例基于版本 2,但看起来您已经安装了版本 3。您只需更改几行即可设置正确向上socket.io。更改这些行:

var app = require('express').createServer(),
    io = require('socket.io').listen(app),
    scores = ;                                

// listen for new web clients:
app.listen(8080);

到这里:

var express = require('express'),
    app = express()
  , http = require('http')
  , server = http.createServer(app)
  , io = require('socket.io').listen(server);

// listen for new web clients:
server.listen(8080);

【讨论】:

感谢您的意见。我尝试了您的代码,但出现错误。我已将其包含在 UPDATE ... 下的原始问题中... 非常感谢比尔。非常感谢 如果有人不想使用 createServer 方法而只想使用 express 方法,那么在新版本中 app.listen() 也会返回服务器实例,我们可以使用它来初始化 socketio 实例。

以上是关于Socket.IO 错误“listen()”方法在迁移到 Express 3.0 后需要一个“http.Server”实例的主要内容,如果未能解决你的问题,请参考以下文章

socket io连接在localhost中正常工作,但在heroku服务器上部署时却没有

socket.io - 如何在命名空间上广播消息?

Heroku 上的 socket.io + node.js

node与socket.io搭配小例子-转载

Node.js + Socket.io + Apache

在 android 上解析 socket.io 数据。 (Gottox Socket.IO)