首页 > node.js socket.io 与 express 集成出错

node.js socket.io 与 express 集成出错

浏览器端

var socket = io.connect('http://localhost:3000');

服务器端

var express = require('express');
var routes = require('./routes/index');
var user = require('./routes/user');
var chat = require('./routes/chat');
var http = require('http');
var path = require('path');
var MongoStore = require('connect-mongo')(express);
var settings = require('./settings');
var flash = require('connect-flash');
var multer  = require('multer');

var app = express();

app.set('port', process.env.PORT || 3000);
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
app.use(flash());
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.json());
app.use(express.urlencoded());
app.use(express.methodOverride());
app.use(express.cookieParser());
app.use(express.session({
  secret:settings.cookiesSecret,
  key:settings.db,
  cookie:{maxAge:1000*60*60*24*30},
  store:new MongoStore({
    db:settings.db
  })
}));

app.use(multer({
  dest: './public/images/user',
  rename: function (fieldname, filename) {
    return filename;
  }
}));

app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));
app.use(express.static(path.join(__dirname,'bower_components')));


if ('development' == app.get('env')) {
  app.use(express.errorHandler());
}

routes(app);

var server =  http.createServer(app);
var io = require('socket.io')(server);
io.on('connection', function(){ console.log('connection') });
server.listen(app.get('port'), function(){
  console.log('Express server listening on port ' + app.get('port'));
});

出错这个错误:

Request URL:http://localhost:3000/socket.io/1/?t=1420622609420
Status Code:400 Bad Request

服务器返回的错误信息是:{"code":0,"message":"Transport unknown"}

这是什么情况?求大神解答~~~


代码都没帖全,socket.io版本是多少,express版本是多少?

我断定你肯定是自己拷贝了一份socket.io 0.9.x版本的浏览器端js,然后在浏览器发起的ws请求
而服务端socket.io版本是1.x, 这两个版本根本不通用

0.9.x版本会先尝试建立websocket连接,地址格式是/socket.io/1/?t=xxx,如果服务器响应超时,或者拒绝,会fallback到polling,服务端响应的数据格式是sid:interval_time:timeout_time:...这样的,不会产生json格式的响应

1.x版本会优先建立polling请求,地址格式是/socket.io/?transport=polling&t=xxx,然后upgrade到websocket,服务端返回json格式的配置文件,如果出现错误,返回的json格式就是{"code":0,"message":"xxx"}

所以你使用了0.9.x版本的客户端socket.io向1.x版本的服务端socket.io发起了请求,解决办法是使用socket.io内置的js,地址是/socket.io/socket.io.js,这个js不需要你自己拷贝进去,直接就可以引用

<script src="/socket.io/socket.io.js"></script>

客户端用这个:

var socket = io.connect('http://localhost');

把端口删掉

另外,你socket.io用的是什么版本。现在已经是1.0了,记得更新哦。。。

【热门文章】
【热门文章】