Использование socket.io в Экспресс 4 и экспресс-генераторе / bin / www
так вот в чем дело: я пытаюсь использовать socket.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
это, как говорится, давайте вспомним, как socket.io документы просят нас уволить его:
var app = require('express').createServer();
var io = require('socket.io')(app);
ок, но я не могу сделать это внутри приложения.Яш, как рекомендуется. Это должно быть сделано ./ bin / www для работы. в./ОГРН/www это то, что я могу сделать, чтобы заставить его работать:
var io = require('socket.io')(server)
хорошо это работает, но я не могу использовать io var в другом месте, и я действительно не хочу ставить свой socket.io функции на .
Я думаю, это просто базовый синтаксис, но я не могу заставить это работать, даже не используя module.exports = server или server.exports = server, ни module.exports.io = app(io) в файле www
Итак, вопрос: как могу ли я использовать socket.io имея этот/bin / www файл в качестве отправной точки моего приложения?
8 ответов:
у меня есть решение для изготовления socket.io доступно в приложении.js.
приложение.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 в модуль после того, как он настройка:
приложение.js
// Socket.io var io = socket_io(); app.io = io; var routes = require('./routes/index')(io);
оказывается, это действительно была какая-то основная проблема синтакса.... Я получил эти строки от это socket.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..... }да! Теперь это работает... Поэтому я думаю, что у меня действительно не было другого выбора, кроме как начать socket.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;приложение.js
// Nothing here
таким образом, все
socket.ioсвязанный код в одном модуле и функции из него я могу вызвать из любого места в приложении.
старый "expressjs", все происходит в приложении "файл".js". Так что ... socket.io привязка к серверу также происходит в этом файле. (Кстати, можно все еще сделать это по-старому, и удалить bin / www)
теперь с новым expressjs, это должно произойти в файле" bin/www".
к счастью, javascript / requirejs позволил легко передавать объекты вокруг. Как заметил Габриэль ОТК-клок, socket.io по-прежнему" импортируется "в" приложение.js "и он привязывается к объекту "приложение" через a собственность
app.io = require('socket.io')();socket.io производится live путем присоединения к нему сервера в "bin / www"
app.io.attach(server);потому что объект " app "передается в" bin/www " ранее
app = require("../app");это действительно так же просто, как
require('socket.io')().attach(server);но делать это "трудный" путь гарантирует, что
app.ioтеперь держит socke.io объект.теперь, если вам это нужно socket.io объект также в разделе " Маршруты / индекс.js " например, просто используйте тот же принцип, чтобы передать это объект вокруг.
первый в "приложение.АО", У
app.use('/', require('./routes/index')(app.io));затем в "индекс, маршруты/.ОАО"
module.exports = function(io){ //now you can use io.emit() in this file var router = express.Router(); return router; }таким образом," io "вводится в" индекс.js".
обновление 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 на стороне клиента, а также. Это не является конкретным выражением, но без него вызов connect не будет работать. API включен в
/node_modules/socket.io-client/socket.io.js.включить этот файл на переднем конце и проверить следующим образом:
var socket = io.connect('http://localhost:3000');
учебник для начинающихот Седрика Пабста
вот краткие основы образуют ссылку на чат приложения:С помощью экспресс-генерировать и EJS по двигателя годный к употреблению в каждом .стандартная маршрутизация файла ejs в express-generate
редактировать файл bin\www и добавить это приложение.Ио.прикрепить(сервер); такой
... /* * Create HTTP server. /* var server = http.createServer(app); /* * attach socket.io /* app.io.attach(server); /* * Listen to provided port, on all network interfaces. /* ...редактировать приложение.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;edit in .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>удачи :) и спасибо многим Седрик Пабст
прочитав все комментарии, я придумал следующее С помощью Socket.io версия сервера: 1.5.0
проблемы, с которыми я столкнулся:
var sockIO = require('socket.io') должно быть var sockIO = require('socket.io')(). (кредит: Чжэ Ху)
сокио.присоединение должно быть sockIO.слушать (кредит: rickrizzo)
шаги
установить Socket.io с помощью следующей команды:
npm install --save socket.ioдобавить приложение.js:
var sockIO = require('socket.io')(); app.sockIO = sockIO;на bin / www, после var server = http.createServer (app) добавить следующее:
var sockIO = app.sockIO; sockIO.listen(server);для проверки функциональности, в приложение.js, вы можете добавить строку:
sockIO.on('connection', function(socket){ console.log('A client connection occurred!'); });
некоторые предыдущие ответы не работают, а другие слишком сложны. Вместо этого попробуйте следующее решение...
установка на стороне сервера и клиента socket.io модули узла:
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 браузера.
Comments