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"}

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

Express node.js socket.io

无聊来逛逛 11 years ago

客户端用这个:


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

把端口删掉

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

888888 answered 11 years ago

代码都没帖全,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>

苦逼D電波兔 answered 11 years ago

Your Answer