Использование socket.io в Express 4 и express-generator/bin/www
Итак, вот сделка: я пытаюсь использовать socket.io в экспресс-проекте. После того, как Express Js 4 был выпущен, я обновил свой экспресс-генератор, и теперь начальные функции приложения входят в файл ./bin/www
, включая эти vars (содержимое www файла: http://jsfiddle.net/avMa5/)
var server = app.listen(app.get('port'), function() {..}
(проверьте его на npm install -g express-generator
, а затем express myApp
чтобы сказать, не забывайте, как socket.io docs просят уволить его:
var app = require('express').createServer();
var io = require('socket.io')(app);
Хорошо, но я не могу это сделать в app.js, как это рекомендовано. Это должно быть сделано в. /bin/www, чтобы работать. in./bin/www это то, что я могу сделать, чтобы заставить его работать:
var io = require('socket.io')(server)
Хорошо, это работает, но я не могу использовать io var где-нибудь еще, и я действительно не хочу помещать свои функции socket.io в файл www
.
Я предполагаю, что это просто базовый синтаксис, но я не могу заставить это работать, даже не используя module.exports = server
или server.exports = server
и module.exports.io = app(io)
в файле www
Итак, вопрос: как я могу использовать socket.io, имея этот файл /bin/www в качестве отправной точки моего приложения?
Ответы
Ответ 1
Оказывается, на самом деле это была основная проблема с sintax.... Я получил эти строки из этого учебника для чата socket.io...
on./bin/www, сразу после var server = app.listen(.....)
var io = require('socket.io').listen(server);
require('../sockets/base')(io);
Итак, теперь я создаю файл.. /sockets/base.js и помещаю в него этого маленького человека:
module.exports = function (io) { // io stuff here... io.on('conection..... }
Да! Теперь он работает... Поэтому я думаю, что у меня действительно не было другого варианта, кроме запуска socket.io внутри /bin/www, потому что именно там был запущен мой http-сервер.
Цель состоит в том, что теперь я могу создавать функции сокетов в других файлах, сохраняя модульную вещь, require('fileHere')(io);
< 3
Ответ 2
У меня есть решение для создания socket.io, доступного в app.js.
app.js:
var express = require( "express" );
var socket_io = require( "socket.io" );
// Express
var app = express();
// Socket.io
var io = socket_io();
app.io = io;
(...)
// socket.io events
io.on( "connection", function( socket )
{
console.log( "A user connected" );
});
module.exports = app;
// Or a shorter version of previous lines:
//
// var app = require( "express" )();
// var io = app.io = require( "socket.io" )();
// io.on( "connection", function( socket ) {
// console.log( "A user connected" );
// });
// module.exports = app;
бен /WWW:
(...)
/**
* Create HTTP server.
*/
var server = http.createServer( app );
/**
* Socket.io
*/
var io = app.io
io.attach( server );
(...)
Таким образом, вы можете получить доступ к переменной io в app.js и даже сделать ее доступной для своих маршрутов, указав module.exports как функцию, которая принимает параметр io как параметр.
index.js
module.exports = function(io) {
var app = require('express');
var router = app.Router();
io.on('connection', function(socket) {
(...)
});
return router;
}
Затем передайте io в модуль после его установки:
app.js
// Socket.io
var io = socket_io();
app.io = io;
var routes = require('./routes/index')(io);
Ответ 3
Старый "expressjs", все происходит в файле "app.js" . Таким образом, привязка socket.io к серверу также происходит в этом файле. (BTW, все еще можно сделать это по-старому, и удалите bin/www)
Теперь с новыми выражениями, это должно произойти в файле bin/www.
К счастью, javascript/requirejs упростили передачу объектов. Как отметил Габриэль Хаутклок, socket.io по-прежнему "импортируется" в "app.js" и привязывается к объекту "app" через свойство
app.io = require('socket.io')();
Сокет .io производится в прямом эфире, прикрепляя к нему сервер в "bin/www"
app.io.attach(server);
потому что объект "app" передается ранее в "bin/www"
app = require("../app");
Это действительно так же просто, как
require('socket.io')().attach(server);
Но выполнение этого "трудного" способа гарантирует, что app.io
теперь содержит объект socke.io.
Теперь, если вам нужен этот объект socket.io также в "routes/index.js", например, просто используйте тот же принцип, чтобы передать этот объект.
Сначала в "app.js" , do
app.use('/', require('./routes/index')(app.io));
Затем в "routes/index.js"
module.exports = function(io){
//now you can use io.emit() in this file
var router = express.Router();
return router;
}
Итак, "io" вводится в "index.js".
Ответ 4
Немного другой подход к инициации socket.io
, он группирует все связанные коды в одном месте:
WWW/бен
/**
* Socket.io
*/
var socketApi = require('../socketApi');
var io = socketApi.io;
io.attach(server);
socketApi.js
var socket_io = require('socket.io');
var io = socket_io();
var socketApi = {};
socketApi.io = io;
io.on('connection', function(socket){
console.log('A user connected');
});
socketApi.sendNotification = function() {
io.sockets.emit('hello', {msg: 'Hello World!'});
}
module.exports = socketApi;
app.js
// Nothing here
Таким образом, весь socket.io
связанный код в одном модуле и функция из него я могу вызывать из любой точки приложения.
Ответ 5
Обновить ответ Gabriel Hautclocq:
В WWW файле код должен появиться следующим образом из-за обновлений с Socket.io. Прикрепление теперь выполняется.
/**
* Create HTTP server.
*/
var server = http.createServer(app);
/**
* Listen on provided port, on all network interfaces.
*/
server.listen(port);
server.on('error', onError);
server.on('listening', onListening);
/**
* Socket.io
*/
var io = app.io;
io.listen(server);`
Кроме того, для получения этого подключения к работе требуется также внедрение API-интерфейса на стороне клиента. Это не экспресс, но без него вызов соединения не будет работать. API включен в
/node_modules/socket.io-client/socket.io.js.
Включите этот файл на передней панели и проверьте следующее:
var socket = io.connect('http://localhost:3000');
Ответ 6
Учебник для новичков от Cedric Pabst
вот краткие основы из ссылки для чата приложений:
с использованием экспресс-генерации
и двигатель ejs
можно использовать в каждой стандартной файловой системе .ejs в экспресс-генерации
отредактируйте файл bin\www и добавьте этот app.io.attach(сервер); как это
...
/*
* Create HTTP server.
/*
var server = http.createServer(app);
/*
* attach socket.io
/*
app.io.attach(server);
/*
* Listen to provided port, on all network interfaces.
/*
...
изменить в app.js
//connect socket.io
... var app = express();
// call socket.io to the app
app.io = require('socket.io')();
//view engine setup
app.set('views', path.join(_dirname, 'views'));
...
...
//start listen with socket.io
app.io.on('connection', function(socket){
console.log('a user connected');
// receive from client (index.ejs) with socket.on
socket.on('new message', function(msg){
console.log('new message: ' + msg);
// send to client (index.ejs) with app.io.emit
// here it reacts direct after receiving a message from the client
app.io.emit('chat message' , msg);
});
});
...
module.exports = app;
изменить в index.ejs
<head>
<title><%= title %></title>
<link rel='stylesheet' href='/stylesheets/style.css' />
<script src="/socket.io/socket.io.js"></script>
//include jquery
<script src="//code.jquery.com/jquery-1.11.3.min.js"></script>
<script>
var socket = io();
//define functions socket.emit sending to server (app.js) and socket.on receiving
// 'new message' is for the id of the socket and $('#new-message') is for the button
function sendFunction() {
socket.emit('new message', $('#new-message').val());
$('#new-message').val('');
}
// 'chat message' is for the id of the socket and $('#new-area') is for the text area
socket.on('chat message', function(msg){
$('#messages-area').append($('<li>').text(msg));
});
</script>
</head>
<body>
<h1><%= title %></h1>
<h3>Welcome to <%= title %></h3>
<ul id="messages-area"></ul>
<form id="form" onsubmit="return false;">
<input id="new-message" type="text" /><button onclick="sendFunction()">Send</button>
</form>
</body>
Удачи:)
и большое спасибо Седрик Пабст
Ответ 7
Прочитав все комментарии, я придумал следующее: Socket.io Server Version: 1.5.0
Проблемы, с которыми я столкнулся:
Шаги
-
Установите Socket.io со следующей командой:
npm install --save socket.io
-
Добавьте в app.js следующее:
var sockIO = require('socket.io')();
app.sockIO = sockIO;
-
В bin/www после var server = http.createServer(app) добавьте следующее:
var sockIO = app.sockIO;
sockIO.listen(server);
-
Чтобы проверить функциональность, в app.js вы можете добавить строку:
sockIO.on('connection', function(socket){
console.log('A client connection occurred!');
});
Ответ 8
Некоторые предыдущие ответы не работают, а другие слишком сложны. Вместо этого попробуйте следующее решение...
Установите серверные и клиентские модули socket.io node:
npm install --save socket.io socket.io-client
на стороне сервера
Добавьте следующий код в bin/www после определения сервера, var server = http.createServer(app);
:
/**
* Socket.io
*/
var io = require('socket.io')(server);
io.on("connection", function(socket){
console.log("SOCKET SERVER CONNECTION");
socket.emit('news', { hello: 'world' });
});
на стороне клиента
Если вы используете webpack, добавьте следующий код в свой файл webpack entry.js:
var socket = require('socket.io-client')();
socket.on('connect', function(){
console.log("SOCKET CLIENT CONNECT")
});
socket.on('news', function(data){
console.log("SOCKET CLIENT NEWS", data)
});
Готово. Посетите свой сайт и проверьте консоль разработчика js браузера.