एक्सप्रेस 4 और एक्सप्रेस-जनरेटर / बिन / www में socket.io का उपयोग करना


93

तो यहाँ सौदा है: मैं एक एक्सप्रेस परियोजना में socket.io का उपयोग करने की कोशिश कर रहा हूं। एक्सप्रेस 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

कहा जा रहा है, चलो याद रखें कि कैसे सॉकेट.ओओ डॉक्स हमें इसे फायर करने के लिए कहते हैं:

var app = require('express').createServer();
var io = require('socket.io')(app);

ठीक है, लेकिन मैं यह सिफारिश की तरह app.js के अंदर नहीं कर सकता। यह काम करने के लिए ./bin/www में किया जाना चाहिए। ,/bin/www यह वह है जो मैं इसे काम करने के लिए कर सकता हूं:

var io = require('socket.io')(server)

ठीक है यह काम करता है, लेकिन मैं कहीं और io var का उपयोग नहीं कर सकता, और मैं वास्तव में wwwफ़ाइल पर अपने सॉकेट.आईओ कार्यों को नहीं डालना चाहता हूं ।

मुझे लगता है कि यह सिर्फ मूल सिंटैक्स है, लेकिन मुझे यह काम करने के लिए नहीं मिल सकता है, यहां तक ​​कि www फ़ाइल का उपयोग module.exports = serverया server.exports = serverन हीmodule.exports.io = app(io)

तो सवाल यह है: मैं अपने ऐप के शुरुआती बिंदु के रूप में इस / बिन / www फ़ाइल वाले सॉकेट का उपयोग कैसे कर सकता हूं?


आप 'में आयात डाल दिया है ./bin/www.। बस इसे उसी जगह पर रखें, जहां आपका var appहै।
अलंदारेव

15
काश लोग एक्सप्रेस-आईओ का सुझाव देना बंद कर देते। यह पुराना है और अब इसका रखरखाव नहीं किया गया है।
बेन फॉर्च्यून

@Mritunjay धन्यवाद, लेकिन इसने इसे हल नहीं किया: /
user1576978

@BenFortune क्षमा करें, मैं इसे ध्यान में रखूंगा।
मृत्युंजय

@alandarev var ऐप = एक्सप्रेस () ?? मैंने इसे सफलतापूर्वक आजमाया, कोई सफलता नहीं
user1576978

जवाबों:


160

मेरे पास 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 );

(...)

इस तरह, आप अपने app.js में io चर का उपयोग कर सकते हैं, और यहां तक ​​कि इसे एक फ़ंक्शन के रूप में मॉड्यूल.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);

1
मैं NodeJS में नया हूं। क्या आप बता सकते हैं app.io = io;कि app.jsफ़ाइल में इस पंक्ति पर वास्तव में क्या हो रहा है
आर्यक सेनगुप्ता

3
यह बस io चर एप्लिकेशन ऑब्जेक्ट में डालने की बात है। यह भी हो सकता है: app.io = socket_io ();
गेब्रियल हौटलक्क्

7
"... और यदि आप चाहें तो इसे अपने मार्गों पर भी उपलब्ध करा सकते हैं।" ठीक है, लेकिन कैसे? यह बहुत अच्छा होगा यदि आप इसे कैसे करें, इस पर एक उदाहरण दे सकते हैं।
डरावना

2
क्या किसी कस्टम प्रॉपर्टी को ऑब्जेक्ट से जोड़ना बुरा नहीं है app? बेहतर प्रतीकों का उपयोग करें या app.set()
अलेक्जेंडर गोंचि

3
क्यों app.io = ioउपयोग किया जाने वाला कर सकता है module.exports = { app, io }बजाय
मानन मेहता

56

आरंभ करने के लिए थोड़ा अलग दृष्टिकोण 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से एक मॉड्यूल में सभी संबंधित कोड और उससे फ़ंक्शन मैं आवेदन में कहीं से भी आह्वान कर सकता हूं।


4
यह उत्तर अधिक उत्थान के योग्य है! बहुत सरल और साफ, यह www , app.js के बाहर सॉकेट मार्गों को भी रखता है और index.js के बाहर भी (हाँ, index.js के बाहर ), इस फ़ाइल में केवल एक्सप्रेस HTTP रूट होना चाहिए।
एडेल्रियोसेंटियागो

1
अद्भुत, बहुत साफ
17:12 पर sanket

3
क्या कोई इसे सॉकेट.आईओ 2.0 के लिए अपडेट कर सकता है? यह मेरे लिए काम नहीं कर रहा है। io.attach (सर्वर) और io.listen (सर्वर) दोनों फेंक "अपरिभाषित की संपत्ति एक्स नहीं पढ़ सकते हैं"।
tsujp

1
@Tsujp से बात करने के लिए मेरा भी यही काम है। आपको सही url को हिट करना होगा और सॉकेट को जोड़ना होगा। क्लाइंट और आप इसे देखेंगे
Tamb

मेरे पास @tsujp जैसी ही समस्या है, मैं सॉकेट का उपयोग कर रहा हूं। 2.3.0 और मैं प्राप्त कर रहा हूंio.attach is not a function
raquelhortab

42

यह पता चला है कि यह वास्तव में कुछ बुनियादी 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 शुरू करने के अलावा कोई विकल्प नहीं था / बिन / www, क्योंकि वह वही है जहां मेरा http सर्वर शुरू किया गया था। लक्ष्य यह है कि अब मैं अन्य फ़ाइल (ओं) में सॉकेट कार्यक्षमता का निर्माण कर सकता हूं, चीज को मॉड्यूलर रखकरrequire('fileHere')(io);

<3


1
समस्या यह है, आप कुछ ऐसा नहीं कर सकतेio.on('connection', function(socket) { res.render('connection.jade') });
Gofilord

3
@ गोफिल्ड, क्योंकि यह सॉकेट्स के पूरे उद्देश्य को हरा देता है ... आपको जो आवश्यक है वह नियमित रूटिंग है जिसमें रेंडरिंग शामिल है। Http रिक्वेस्ट के बिना क्लाइंट और सर्वर के बीच संदेश भेजने के लिए यहां सॉकेट हैं। शायद इस लेख को पढ़ें enterprisewebbook.com/ch8_websockets.html
Unispaw

19

पुरानी "एक्सप्रेसज", सब कुछ "app.js" फ़ाइल में हो रहा है। तो socket.io सर्वर पर बाइंडिंग उस फ़ाइल में भी होता है। (BTW, एक अभी भी इसे पुराने तरीके से कर सकता है, और बिन / www को हटा सकता है)

अब नए एक्सप्रेस के साथ, इसे "बिन / www" फ़ाइल में होना चाहिए।

सौभाग्य से, जावास्क्रिप्ट / requjs ने वस्तुओं को पास करना आसान बना दिया। जैसा कि गेब्रियल हाउटलोक ने बताया, सॉकेट.आईओ अभी भी "app.js" में "आयातित" है और यह एक संपत्ति के माध्यम से "ऐप" ऑब्जेक्ट से जुड़ा हुआ है

app.io = require('socket.io')();

सॉकेट.io को "बिन / www" में सर्वर से जोड़कर लाइव किया जाता है

app.io.attach(server); 

क्योंकि "ऐप" ऑब्जेक्ट पहले "बिन / www" में पारित किया गया है

app = require("../app");

यह वास्तव में बस के रूप में सरल है

require('socket.io')().attach(server);

लेकिन इसे "कठिन" तरीके से करना सुनिश्चित करता है कि app.ioअब socke.io ऑब्जेक्ट रखता है।

अब यदि आपको उदाहरण के लिए "रूट्स / इंडेक्स.जैस" में भी इस सॉकेट की जरूरत है, तो इस ऑब्जेक्ट को पास करने के लिए उसी सिद्धांत का उपयोग करें।

सबसे पहले "app.js" में, करें

app.use('/', require('./routes/index')(app.io));

फिर "मार्गों / index.js" में

module.exports = function(io){
    //now you can use io.emit() in this file

    var router = express.Router();



    return router;
 }

तो "io" को "index.js" में इंजेक्ट किया जाता है।


9

गैब्रियल हाटक्लोक की प्रतिक्रिया के लिए अपडेट करें :

Www फ़ाइल में, कोड सॉकेट.आईओ के साथ अद्यतन के कारण निम्न के रूप में दिखाई देना चाहिए। अटैच अब सुनो।

/**
 * 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);`

इसके अतिरिक्त काम करने के लिए कनेक्शन के लिए क्लाइंट साइड एपीआई को भी लागू करने की आवश्यकता होती है। यह विशिष्ट नहीं है, लेकिन इसके बिना कनेक्ट कॉल काम नहीं करेगी। एपीआई में शामिल है

/node_modules/socket.io-client/socket.io.js. 

इस फ़ाइल को सामने के छोर पर शामिल करें और निम्नलिखित के साथ परीक्षण करें:

var socket = io.connect('http://localhost:3000');

7

सभी टिप्पणियों के माध्यम से पढ़ने के बाद, मैं सॉकेट.आईओ सर्वर संस्करण का उपयोग करके निम्नलिखित के साथ आया : 1.5.0

जिन मुद्दों पर मैं भाग गया था:

  1. var sockIO = आवश्यकता ('socket.io') var sockIO होनी चाहिए = ('socket.io') () । (श्रेय: झू हू )

  2. sockIO.attach को sockIO होना चाहिए। सुनो (क्रेडिट: रिक्रिएज़ो )

कदम

  1. निम्नलिखित कमांड के साथ Socket.io स्थापित करें:

    npm install --save socket.io
  2. App.js के लिए निम्नलिखित जोड़ें :

    var sockIO = require('socket.io')();
    app.sockIO = sockIO;
    
  3. में बिन / www , के बाद वर सर्वर = http.createServer (ऐप्लिकेशन) , निम्नलिखित जोड़ें:

    var sockIO = app.sockIO;
    sockIO.listen(server);
    
  4. कार्यक्षमता का परीक्षण करने के लिए, app.js में , आप लाइन जोड़ सकते हैं:

    sockIO.on('connection', function(socket){
        console.log('A client connection occurred!');
    });
    

5

सीड्रिक पाब्स्ट के शुरुआती लोगों के लिए एक ट्यूटोरियल
यह है कि मूल बातें एक ऐप चैट के लिए लिंक हैं:

एक्सप्रेस-जेनरेट का उपयोग करना और हर .ejs में प्रयोग करने योग्य ईजेएस इंजन, एक्सप्रेस-जनरेट में मानक रूटिंग

फ़ाइल बिन \ www को संपादित करें और इस ऐप को जोड़ें ।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>

मज़े करो :) और सेड्रिक पाब्स्ट को बहुत धन्यवाद


2

पिछले कुछ जवाब काम नहीं कर रहे हैं और अन्य अत्यधिक जटिल हैं। इसके बजाय निम्नलिखित समाधान का प्रयास करें ...

सर्वर-साइड और क्लाइंट-साइड सॉकेट स्थापित करें। नोड नोड्यूल:

npm install --save socket.io socket.io-client

सर्वर साइड

सर्वर की परिभाषा के बाद बिन / 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' });
});

ग्राहक की ओर

यदि वेबपैक का उपयोग कर रहे हैं, तो अपने वेबपैक प्रविष्टि.जेएस फ़ाइल में निम्न कोड जोड़ें :

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)
});

किया हुआ। अपनी साइट पर जाएँ और ब्राउज़र के जे एस डेवलपर कंसोल की जाँच करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.