2014-09-15 2 views
0

헤모 크에서 작동하도록 socketIO 1.1을 설정하는 데 문제가 있습니다. 저는 Express v4.2를 사용하고 있습니다. socketio는 localhost에서 완벽하게 실행됩니다.Heroku의 Nodejs + Expressjs + SocketIO에서 GET /socket.io/?EIO ... 404

Heroku가 로그에서 : 브라우저에서

2014-09-15T09:40:14.578660+00:00 app[web.1]: GET /socket.io/?EIO=3&transport=polling&t=1410774014583-86 404 6ms - 744b 

:

GET http://[mydomainname]/socket.io/?EIO=3&transport=polling&t=1410774080589-97 404 (Not Found) socket.io.js:2680Request.create socket.io.js:2680Request socket.io.js:2614XHR.request socket.io.js:2555XHR.doPoll socket.io.js:2585Polling.poll socket.io.js:2951Polling.doOpen socket.io.js:2895Transport.open socket.io.js:2106Socket.open socket.io.js:1580Socket socket.io.js:1467Socket socket.io.js:1419Manager.open.Manager.connect socket.io.js:272(anonymous function) 

내가 소켓 IO의 문서화에 권장되는 구성을 따랐다 그러나 Heroku가에,이 오류를 제공합니다. 관련 코드를 다음과 같이

<script src="my_path_to/socket.io.js"></script> 
<script> 
var socket = io.connect(); 

var socketId = ''; 

socket.on('welcome', function (data) { 
    socketId = data.message; 
}); 
</script> 

가 나는 또한 "http://localhost", "http://localhost:3000"에 io.connect을 시도하고, 내 Heroku가 응용 프로그램 도메인 : 내 클라이언트 파일에서

var express = require('express'); 
/* routes */ 
var routes = require('./routes/index'); 
var users = require('./routes/users'); 

var path = require('path'); 
var favicon = require('static-favicon'); 
var logger = require('morgan'); 
var cookieParser = require('cookie-parser'); 
var bodyParser = require('body-parser'); 
var cons = require('consolidate'); 

var app = express(); 

// view engine setup 
app.set('views', path.join(__dirname, 'views')); 
app.engine('dust', cons.dust); 
app.set('view engine', 'dust'); 

app.use(favicon()); 
app.use(logger('dev')); 

app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded()); 
app.use(cookieParser('hashionhashion')); 
app.use(require('less-middleware')(path.join(__dirname, 'public'))); 
app.use(express.static(path.join(__dirname, 'public'))); 

//routing 
app.use('/', routes); 
app.use('/users', users); 


/// catch 404 and forward to error handler 
app.use(function(req, res, next) { 
    var err = new Error('Not Found'); 
    err.status = 404; 
    next(err); 
}); 

/// error handlers 

// development error handler 
// will print stacktrace 
if (app.get('env') === 'development') { 
    app.use(function(err, req, res, next) { 
     res.status(err.status || 500); 
     res.render('error', { 
      message: err.message, 
      error: err 
     }); 
    }); 
} 

// production error handler 
// no stacktraces leaked to user 
app.use(function(err, req, res, next) { 
    res.status(err.status || 500); 
    res.render('error', { 
     message: err.message, 
     error: {} 
    }); 
}); 



//start the server 
var server = require('http').Server(app); 

var io = require('socket.io').listen(server); 
var ioSockets = {}; 

io.on('connection', function(socket) { 

    ioSockets[socket.id] = socket; 

    socket.emit('welcome', {message: socket.id}); 

    socket.on('disconnect', function(socket) { 
     delete ioSockets[socket.id]; 
    }); 
}); 

exports.ioSockets = ioSockets; 
module.exports = app; 

server.listen(3000, function() { 
    console.log('Congrats, nothing broke!! Listening on port %d', server.address().port); 
}); 

, 스크립트는 다음과 같습니다. 모두 같은 오류가 발생합니다.

도움이 될 것입니다.

+0

실제로이 문제를 해결 했습니까? – lascort

+0

아래에서 내 대답을 참조하십시오. – Calvintwr

+0

나는 그랬다. 하지만 나도 그것을 얻지 못했거나 히로쿠에서 표현을 업데이트하는 것은 나를 위해 작동하지 않았다 – lascort

답변

0

socket.io 경로를 변경 한 것 같습니다. 내가 src="my_path_to/socket.io.js"을 보았 기 때문에. socket.io는 연결하려고 시도하지만 404가 있습니다.

'/socket.io/'를 처리하는 경로가 있습니까?

404 오류도 해결됩니다. 다른 오류가 발생합니다. 현재 heroku에서 socket.io를 https 주소로 설정해야합니다. 그렇지 않으면 socket.io가 폴링 중에 작동합니다.

더 상세 : 가 https://github.com/Automattic/engine.io/issues/261

+0

귀하의 의견에 감사드립니다. 실제로 "catchall"경로 처리기가 있습니다. 그러나 나는 socketio를 다루는 길을 무력화하려고 노력했다. router.get '('/ : 사용자 함수 (REQ, 입술 옆) { 경우 (req.params.user === 'socket.io') 다음 {창 (ERR)} });' 폴링은 기본적으로 socket.io에서 사용되는 것으로 생각 했습니까? – Calvintwr

+1

socket.io 1.x에는 두 개의 기본 전송 [ 'polling', 'websocket']이 있습니다. 먼저 폴링을 사용하여 서버에 연결합니다. 서버는 클라이언트에게 '업그레이드가 필요합니다 (HTTP 상태 100)'라고 알려줍니다. 클라이언트가이를 받으면 업그레이드하십시오. 하나의 http 요청에서 업그레이드 작업이 발생합니다. 나중에 데이터를 방출하십시오. 모두 하나로 연결됩니다. 문제는 heroku가 SSL없이 이처럼 끈적한 연결을 지원하지 않는다는 것입니다. – colder

관련 문제