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

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

  • var sockIO = require ('socket.io') должен быть var sockIO = require ('socket.io') (). (Кредит: Zhe Hu)

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

Шаги

  • Установите 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 браузера.