Использование сокета.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

проблемы, с которыми я столкнулся:

  1. var sockIO = require ('socket.io') должно быть var sockIO = require ('socket.io')(). (Кредит: Чжэ Ху)

  2. sockIO.прикрепление должно быть sockIO.слушать (кредит: rickrizzo)

шаги

  1. Установить Сокет.io со следующей командой:

    npm install --save socket.io
    
  2. добавить app.js:

    var sockIO = require('socket.io')();
    app.sockIO = sockIO;
    
  3. на bin / www, после var server = http.createServer (app) добавить следующее:

    var sockIO = app.sockIO;
    sockIO.listen(server);
    
  4. для проверки функциональности, в 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 браузера.