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

 奔跑的蜗牛彡 发布于 2022-11-07 20:53

浏览器端

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

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

2 个回答
  • 客户端用这个:

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

    把端口删掉

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

    2022-11-12 01:43 回答
  • 代码都没帖全,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?1.2.1"></script>
    
    2022-11-12 01:43 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有