Браузер не может получить файл socket.io.js, используя экспресс
У меня проблема с примерами socket.io. Мой браузер не может получить файл socket.io.js(ошибка 404 в консоли).
Код, который работает:
server.js
var app = require('express').createServer()
, io = require('socket.io').listen(81);
app.listen(80);
app.get('/', function (req, res) {
res.sendfile(__dirname + '/index.html');
});
io.sockets.on('connection', function (socket) {
socket.emit('news', { hello: 'world' });
socket.on('my other event', function (data) {
console.log(data);
});
});
index.html
<script src="http://192.168.1.104:81/socket.io/socket.io.js"></script>
<script>
var socket = io.connect('http://192.168.1.104:81');
socket.on('news', function (data) {
console.log(data);
socket.emit('my other event', { my: 'data' });
});
</script>
Но этого нет:
server.js
var app = require('express').createServer()
, io = require('socket.io').listen(app);
app.listen(80);
app.get('/', function (req, res) {
res.sendfile(__dirname + '/index.html');
});
io.sockets.on('connection', function (socket) {
socket.emit('news', { hello: 'world' });
socket.on('my other event', function (data) {
console.log(data);
});
});
index.html
<script src="http://192.168.1.104:80/socket.io/socket.io.js"></script>
<script>
var socket = io.connect('http://192.168.1.104:80');
socket.on('news', function (data) {
console.log(data);
socket.emit('my other event', { my: 'data' });
});
</script>
В этом случае мой браузер не может получить файл socket.io.js.
Ответы
Ответ 1
РЕДАКТИРОВАТЬ: все приведенные ниже тексты являются неправильными до следующего "EDIT". Оставляя его там как след...
есть одна вещь, которую вы должны знать, две вещи, которые вы должны сделать + все необходимые Экспресс-документ здесь:
- Экспресс-фильтр/обрабатывать каждый доступ к вашему серверу node. Это означает, что, когда вы пытаетесь получить доступ к вашему файлу socket.io script, Express пытается найти его в маршрутах, которые вы объявили и завершили с ошибками, как вы этого не сделали (и вы были не права).
-
Самое важное: объявить статическую, не "вычисленную" папку в
где вы поместите все свои статические файлы (css, клиентские скрипты, изображения):
app.use('/static', express.static(__dirname + '/static'));
Эта строка должна быть помещена в ваш вызов app.configure
до app.use(app.router)
(я на самом деле положил его первым)
Мне нравится иметь это /static/scripts;/static/css;/static/img, но вы можете приспосабливаться к вашим потребностям.
-
Измените ссылку на файл socket.io script на относительный путь
(необязательно, но настоятельно рекомендуется): src='/static/scripts/socket.io/socket.io.js'
РЕДАКТИРОВАТЬ: я ошибаюсь, очень ошибаюсь, и я сожалею об этом. Socket.io генерирует различные пути/файлы, необходимые, и вам не нужно объявлять их и не копировать любые клиентские файлы script.
Попробуйте переключить клиентскую строку <script src="http://192.168.1.104:81/socket.io/socket.io.js"></script>
на нормальный относительный <script src="/socket.io/socket.io.js"></script>
, потому что это единственное различие между вашим кодом и кодом экспресс-кода.
Ответ 2
Какую Экспресс-версию вы используете?
API изменился с Express 2.x на 3.x, поэтому ответ находится в разделе Socket.IO совместимости на Миграция с 2.x до 3.x wiki:
Socket.IO .listen()
метод принимает экземпляр http.Server
в качестве аргумента.
Начиная с 3.x, возвращаемое значение express()
не является экземпляром http.Server
. Чтобы заставить Socket.IO работать с Express 3.x, убедитесь, что вы вручную создали и передали свой экземпляр http.Server
в метод Socket.IO .listen()
:
var app = express()
, http = require('http')
, server = http.createServer(app)
, io = require('socket.io').listen(server);
server.listen(3000);