Использование сокета.io в Express 4 и express-generator's / bin / www
Итак, вот сделка: я пытаюсь использовать сокет.io в экспресс-проекте. После того, как Express Js 4 был lauched, я обновил свой экспресс-генератор, и теперь начальные функции приложения входят в ./bin/www
файл, включая эти vars (содержимое файла www:http://jsfiddle.net/avMa5/ )
var server = app.listen(app.get('port'), function() {..}
(проверьте npm install -g express-generator
а то express myApp
это, как говорится, давайте вспомним, как сокет.IO docs просят нас уволить его:
var app = require('express').createServer();
var io = require('socket.io')(app);
ок, но я не могу сделать это внутри приложения.js, как рекомендовано. Это должно быть сделано ./ bin / www для работы. в./ОГРН/www это то, что я могу сделать, чтобы заставить его работать:
var io = require('socket.io')(server)
Ok это работает, но я не могу использовать io var в другом месте, и я действительно не хочу ставить свой сокет.функции ввода-вывода на .
Я думаю, это просто базовый синтаксис, но я не могу заставить это работать, даже не используя module.exports = server
или server.exports = server
, ни module.exports.io = app(io)
на www файлом
Итак, вопрос: как могу ли я использовать сокет.io, имеющий этот/bin / www файл в качестве отправной точки моего приложения?
8 ответов
у меня есть решение для создания сокета.io доступен в приложении.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;
bin / www:
(...)
/**
* Create HTTP server.
*/
var server = http.createServer( app );
/**
* Socket.io
*/
var io = app.io
io.attach( server );
(...)
таким образом, вы можете получить доступ к переменной io в вашем приложении.js, и даже сделать его доступным для ваших маршрутов, определив модуль.экспорт как функция, которая принимает io в качестве параметра.
.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);
оказывается, это действительно была какая-то основная проблема синтакса.... Я получил эти строки от эта розетка.IO чат учебник...
on ./ bin / www, сразу после var server = app.listen(.....)
var io = require('socket.io').listen(server);
require('../sockets/base')(io);
Итак, я создаю ../ розетки / основание.JS файл и положить этот маленький парень внутри него:
module.exports = function (io) { // io stuff here... io.on('conection..... }
да! Теперь это работает... Поэтому, я думаю, у меня действительно не было другого выбора, кроме запуска сокета.io внутри /bin / www, потому что именно там был запущен мой http-сервер.
Цель в том, что теперь я могу построить функциональность сокета в других файлах, сохраняя модульность, по require('fileHere')(io);
немного другой подход, чтобы начать socket.io
, он группирует весь связанный код в одном месте:
bin / 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
связанный код в одном модуле и функции из него я могу вызвать из любого места в приложении.
старый "expressjs", все происходит в приложении "файл".js". Итак, розетка.привязка io к серверу также происходит в этом файле. (Кстати, все еще можно сделать это по-старому и удалить bin / www)
теперь с новым expressjs это должно произойти в файле" bin/www".
к счастью, javascript / requirejs облегчил передачу объектов. Как Габриэль Hautclocq указал, гнездо.Ио по-прежнему "импортированы" в "приложение.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
теперь держит носок.объект io.
теперь, если вам нужен этот сокет.объект ввода-вывода также в " маршрутах / индексе.js " например, просто используйте тот же принцип, чтобы передать это объект вокруг.
сначала в " app.js", do
app.use('/', require('./routes/index')(app.io));
затем в разделе " Маршруты / индекс.js"
module.exports = function(io){
//now you can use io.emit() in this file
var router = express.Router();
return router;
}
таким образом," io "вводится в" индекс.js".
обновление Габриэль HautclocqС:
в файле www код должен отображаться следующим образом из-за обновлений с сокетом.Ио. Attach теперь слушайте.
/**
* 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 на стороне клиента. Это не выражается конкретно, но без него вызов connect не будет работать. API включен в
/node_modules/socket.io-client/socket.io.js.
включить этот файл на передней панели и проверить следующим образом:
var socket = io.connect('http://localhost:3000');
учебник для начинающих от Седрика Пабста
вот краткие основы формируют ссылку для чата приложения:
использование express-generate и EJS по двигателя годный к употреблению в каждом .стандартная маршрутизация файла ejs в express-generate
редактировать файл bin\www и добавить это приложение.Ио.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;
изменить в .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>
удачи :) и большое спасибо Седрик Пабст
прочитав все комментарии, я придумал следующее, используя гнездо.версия сервера ввода-вывода: 1.5.0
проблемы, с которыми я столкнулся:
var sockIO = require ('socket.io') должно быть var sockIO = require ('socket.io')(). (Кредит: Чжэ Ху)
sockIO.прикрепление должно быть sockIO.слушать (кредит: rickrizzo)
шаги
-
Установить Сокет.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!'); });
некоторые предыдущие ответы не работают, а другие слишком сложны. Вместо этого попробуйте следующее решение...
установите серверный и клиентский сокеты.модули узлов ввода-вывода:
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 запись.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 браузера.