Oto sprawa: próbuję użyć socket.io w projekcie ekspresowym. Po uruchomieniu Express Js 4 zaktualizowałem mój generator ekspresów i teraz początkowe funkcje aplikacji trafiają do ./bin/www
pliku, w tym te vars (zawartość pliku www: http://jsfiddle.net/avMa5/ )
var server = app.listen(app.get('port'), function() {..}
(sprawdź to do npm install -g express-generator
czasuexpress myApp
Biorąc to pod uwagę, pamiętajmy, jak dokumenty socket.io proszą nas o odpalenie go:
var app = require('express').createServer();
var io = require('socket.io')(app);
Ok, ale nie mogę tego zrobić w app.js, jak zalecane. Aby to zadziałało, należy to zrobić w ./bin/www. in ./bin/www oto, co mogę zrobić, aby działał:
var io = require('socket.io')(server)
Ok, to działa, ale nie mogę używać zmiennej io nigdzie indziej i naprawdę nie chcę umieszczać moich funkcji socket.io w www
pliku.
Wydaje mi się, że to tylko podstawowa składnia, ale nie mogę tego uruchomić, nawet nie używając module.exports = server
ani server.exports = server
ani module.exports.io = app(io)
w pliku www
Więc pytanie brzmi: jak mogę używać socket.io mając ten plik / bin / www jako punkt wyjścia mojej aplikacji?
źródło
./bin/www.
. Po prostu umieść go w tym samym miejscu, w którym jesteśvar app
.Odpowiedzi:
Mam rozwiązanie umożliwiające udostępnienie socket.io w 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;
bin / www:
(...) /** * Create HTTP server. */ var server = http.createServer( app ); /** * Socket.io */ var io = app.io io.attach( server ); (...)
W ten sposób możesz uzyskać dostęp do zmiennej io w pliku app.js, a nawet udostępnić ją dla swoich tras, definiując module.exports jako funkcję, która przyjmuje parametr io jako parametr.
index.js
module.exports = function(io) { var app = require('express'); var router = app.Router(); io.on('connection', function(socket) { (...) }); return router; }
Następnie przekaż io do modułu po jego skonfigurowaniu:
app.js
// Socket.io var io = socket_io(); app.io = io; var routes = require('./routes/index')(io);
źródło
app.io = io;
wapp.js
plikuapp
obiektu własność niestandardową ? Lepiej używaj symboli lubapp.set()
.app.io = io
skoro możeszmodule.exports = { app, io }
zamiast tego użyćTrochę inne podejście do inicjowania
socket.io
, grupuje wszystkie powiązane kody w jednym miejscu: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
W ten sposób cały
socket.io
powiązany kod w jednym module i funkcje z niego mogę wywołać z dowolnego miejsca w aplikacji.źródło
io.attach is not a function
Okazuje się, że to naprawdę był jakiś podstawowy problem z sintaxem ... Mam te linie z tego samouczka czatu socket.io ...
na ./bin/www, zaraz po
var server = app.listen(.....)
var io = require('socket.io').listen(server); require('../sockets/base')(io);
więc teraz tworzę plik ../sockets/base.js i umieszczam w nim tego małego gościa:
module.exports = function (io) { // io stuff here... io.on('conection..... }
Tak! Teraz to działa ... Więc myślę, że naprawdę nie miałem innej opcji niż uruchomienie socket.io w / bin / www, ponieważ tam został uruchomiony mój serwer http. Celem jest to, że teraz mogę zbudować funkcjonalność gniazda w innym pliku (plikach), zachowując modułowość
require('fileHere')(io);
<3
źródło
io.on('connection', function(socket) { res.render('connection.jade') });
Stare "expressjs", wszystko dzieje się w pliku "app.js". Zatem powiązanie socket.io z serwerem ma miejsce również w tym pliku. (BTW, nadal można to zrobić starym sposobem i usunąć bin / www)
Teraz, z nowymi expressjami, musi się to stać w pliku „bin / www”.
Na szczęście javascript / requirejs ułatwił przekazywanie obiektów. Jak zauważył Gabriel Hautclocq, socket.io jest nadal „importowany” do „app.js” i jest dołączany do obiektu „app” za pośrednictwem właściwości
app.io = require('socket.io')();
Socket.io jest tworzone na żywo przez dołączenie do niego serwera w „bin / www”
ponieważ obiekt „app” jest wcześniej przekazywany do „bin / www”
app = require("../app");
To naprawdę tak proste, jak
require('socket.io')().attach(server);
Ale zrobienie tego w „trudny” sposób gwarantuje, że
app.io
teraz będzie trzymany obiekt socke.io.Teraz, jeśli potrzebujesz tego obiektu socket.io również na przykład w "route / index.js", po prostu użyj tej samej zasady, aby przekazać ten obiekt.
Najpierw w „app.js” zrób
app.use('/', require('./routes/index')(app.io));
Następnie w „route / index.js”
module.exports = function(io){ //now you can use io.emit() in this file var router = express.Router(); return router; }
Więc „io” zostaje wstawione do „index.js”.
źródło
Aktualizacja odpowiedzi Gabriela Hautclocqa :
W pliku www kod powinien wyglądać następująco ze względu na aktualizacje z Socket.io. Dołącz jest teraz Słuchaj.
/** * 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);`
Ponadto uzyskanie tego połączenia do pracy wymaga również zaimplementowania interfejsu API po stronie klienta. To nie jest specyficzne dla Express, ale bez niego połączenie connect nie będzie działać. API jest zawarte w
Dołącz ten plik do interfejsu użytkownika i przetestuj z następującymi elementami:
var socket = io.connect('http://localhost:3000');
źródło
Po przeczytaniu wszystkich komentarzy, przy użyciu Socket.io Server Version: 1.5.0 wymyśliłem następujące rzeczy
Problemy, które napotkałem:
var sockIO = require ('socket.io') powinno być var sockIO = require ('socket.io') () . (Kredyt dla: Zhe Hu )
sockIO.attach powinno być sockIO. słuchaj (Credit to: rickrizzo )
Kroki
Zainstaluj Socket.io za pomocą następującego polecenia:
Dodaj do app.js :
var sockIO = require('socket.io')(); app.sockIO = sockIO;
W bin / www , po var server = http.createServer (app) , dodaj:
var sockIO = app.sockIO; sockIO.listen(server);
Aby przetestować funkcjonalność, w app.js możesz dodać wiersz:
sockIO.on('connection', function(socket){ console.log('A client connection occurred!'); });
źródło
Samouczek dla początkujących autorstwa Cedric Pabst
zawiera krótkie podstawy z linku do czatu w aplikacji:
używając ekspresowego generowania i silnika ejs używanego w każdym standardowym routingu plików .ejs w ekspresowym generowaniu
edytuj plik bin \ www i dodaj ten plik app.io.attach (serwer); lubię to
... /* * Create HTTP server. /* var server = http.createServer(app); /* * attach socket.io /* app.io.attach(server); /* * Listen to provided port, on all network interfaces. /* ...
edytować w 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;
edytuj w 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>
Baw się dobrze :) i dziękuję Cedricowi Pabstowi
źródło
Niektóre poprzednie odpowiedzi nie działają, a inne są zbyt skomplikowane. Zamiast tego wypróbuj następujące rozwiązanie ...
Zainstaluj moduły węzłów socket.io po stronie serwera i klienta:
Po stronie serwera
Dodaj następujący kod do bin / www po definicji serwera
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' }); });
Strona klienta
Jeśli używasz pakietu internetowego, dodaj następujący kod do pliku entry.js pakietu internetowego :
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) });
Gotowe. Odwiedź swoją witrynę i sprawdź konsolę programisty js przeglądarki.
źródło