এক্সপ্রেস 4 এ সকেট.ইও এবং এক্সপ্রেস-জেনারেটরের / বিন / www ব্যবহার করে


93

সুতরাং এখানে চুক্তিটি হ'ল: আমি একটি এক্সপ্রেস প্রকল্পে সকেট.আইও ব্যবহার করার চেষ্টা করছি। এক্সপ্রেস জেএস 4 টি হাসানোর পরে, আমি আমার এক্সপ্রেস-জেনারেটর আপডেট করেছি এবং এখন অ্যাপ্লিকেশনের প্রাথমিক ফাংশনগুলি ./bin/wwwফাইলগুলিতে চলে যায় , সেই ওয়ারগুলি সহ (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);

ঠিক আছে তবে আমি এটি অ্যাপ.জেএস এর ভিতরে করতে পারছি না, যেমন প্রস্তাবিত। এটি কাজ করার জন্য ./bin/www এ করা উচিত। in ./bin/www এটিকে কাজ করতে আমি এটি করতে পারি:

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

ঠিক আছে এটি কাজ করে, তবে আমি অন্য কোথাও আইও ভার ব্যবহার করতে পারি না এবং আমি আমার সকেট.আইও ফাংশনে wwwফাইলটিতে রাখতে চাই না ।

আমি অনুমান করি এটি কেবলমাত্র বেসিক সিনট্যাক্স, তবে আমি এটি কাজ করতে পারি না, এমনকি www ফাইল ব্যবহার করে module.exports = serverবা server.exports = serverনাও পারি নাmodule.exports.io = app(io)

সুতরাং প্রশ্নটি হল: আমি কীভাবে আমার অ্যাপ্লিকেশনটির সূচনা পয়েন্ট হিসাবে এই / বিন / www ফাইলটি সকেট.আইও ব্যবহার করতে পারি?


আপনাকে আমদানি করতে হবে না ./bin/www.। এটি যেখানে একই জায়গায় স্থাপন করুন var app
আলানাদেভ

15
আমি আশা করি লোকেরা এক্সপ্রেস-আইও পরামর্শ দেওয়া বন্ধ করে দেয়। এটি পুরানো এবং আর রক্ষণাবেক্ষণ করা হয় না।
বেন ফরচুন

@ মৃতুঞ্জয় আপনাকে ধন্যবাদ জানায়, কিন্তু এটির সমাধান হয়নি: /
ব্যবহারকারী 1576978

@ বেনফর্টুন দুঃখিত দুঃখিত আমি এটি মনে রাখব।
মৃতুঞ্জয়

@ আলান্দারেভ ভার অ্যাপ = এক্সপ্রেস () ?? আমি
নিখুঁতভাবে

উত্তর:


161

আমার সকেট.ইওটিকে অ্যাপ.জেএসএসে উপলব্ধ করার জন্য একটি সমাধান রয়েছে।

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 কে প্যারামিটার হিসাবে স্বীকার করে।

index.js

module.exports = function(io) {
    var app = require('express');
    var router = app.Router();

    io.on('connection', function(socket) { 
        (...) 
    });

    return router;
}

তারপরে আইও সেটআপ হওয়ার পরে মডিউলে পাস করুন:

app.js

// Socket.io
var io = socket_io();
app.io = io;

var routes = require('./routes/index')(io);

4
আমি নোডজেএসে নতুন। আপনি কি দয়া app.io = io;করে app.jsফাইলটিতে এই লাইনে কী ঘটছে তা ব্যাখ্যা করতে পারেন
আর্যাক সেনগুপ্ত

4
এটি কেবল আইও ভেরিয়েবলটি অ্যাপ্লিকেশনটির মধ্যে রাখার বিষয়। এটিও হতে পারে: app.io = সকেট_ও ();
গ্যাব্রিয়েল হাটক্লোক

7
"... এবং আপনি চাইলে এটি আপনার রুটেও উপলভ্য করুন" " ঠিক আছে, কিন্তু কিভাবে? এটি কীভাবে করা যায় তার একটি উদাহরণ দিতে পারলে দুর্দান্ত হবে।
scaryguy

4
বস্তুর সাথে একটি কাস্টম সম্পত্তি যুক্ত করা খারাপ নয় app? আরও ভাল ব্যবহার চিহ্ন বা app.set()
আলেকজান্ডার গনচি

4
কেন app.io = ioআপনি যখন module.exports = { app, io }পরিবর্তে ব্যবহার করতে পারেন
মানান মেহতা

61

আরম্ভ করার জন্য কিছুটা ভিন্ন পদ্ধতি 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একটি মডিউলে সমস্ত সম্পর্কিত কোড এবং এটি থেকে ফাংশন আমি যে কোনও জায়গা থেকে আবেদন করতে পারি application


4
এই উত্তরটি আরও উন্নয়নের দাবিদার! খুব সহজ এবং পরিষ্কার, এটি www , app.js এর বাইরে এবং index.js এর বাইরেও (হ্যাঁ, index.js এর বাইরে ) রাখে, এই ফাইলটিতে কেবল এক্সপ্রেস এইচটিটিপি রুট থাকা উচিত।
adelriosantiago

4
আশ্চর্যজনক, খুব পরিষ্কার
সানকেট

4
Socket.io 2.0 এর জন্য কি কেউ এটি আপডেট করতে পারে? এটা আমার পক্ষে কাজ করছে না io.attach (সার্ভার) এবং io.listen (সার্ভার) উভয়ই "অপরিশোধিত সম্পত্তি এক্স পড়তে পারে না" throw
জর্দান

4
এছাড়াও @tsujp এর সাথে কথা বলতে আমার একই কাজ করে। আপনাকে ডান ইউআরএল হিট করতে হবে এবং সকেট.আইও ক্লায়েন্ট যুক্ত করতে হবে এবং আপনি এটি কাজ করতে দেখবেন
টাম্ব

@Tsujp এর মতো আমারও একই সমস্যা রয়েছে, আমি সকেট.ইও ২.৩.০ ব্যবহার করছি এবং পাচ্ছিio.attach is not a function
রাকেলহর্তব

44

দেখা যাচ্ছে এটি আসলে কিছু বেসিক সিনট্যাক্স সমস্যা ছিল .... আমি এই লাইনগুলি এই সকেট.আইও চ্যাট টিউটোরিয়াল থেকে পেয়েছি ...

./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..... }

হ্যাঁ! এখন এটি কাজ করে ... সুতরাং আমি অনুমান করি যে আমার কাছে সত্যিই / বিন / www এর ভিতরে সকেট.আইও শুরু করা ছাড়া অন্য কোনও বিকল্প ছিল না, কারণ এটিই আমার পোস্ট সার্ভারটি শুরু হয়েছিল। লক্ষ্যটি হ'ল এখন আমি জিনিসটিকে মডিউল করে রেখে অন্য ফাইলগুলিতে সকেট কার্যকারিতা তৈরি করতে পারিrequire('fileHere')(io);

<3


4
সমস্যাটি হল, আপনি এর মতো কিছু করতে পারবেন নাio.on('connection', function(socket) { res.render('connection.jade') });
গফিলর্ড

4
@ গফিলর্ড এটি কারণ এটি সকেটের পুরো উদ্দেশ্যকে পরাস্ত করে ... আপনার যা প্রয়োজন তা নিয়মিত রাউটিং যা রেন্ডারিং অন্তর্ভুক্ত। সকেটগুলি এইচটিপি অনুরোধ ছাড়াই ক্লায়েন্ট এবং সার্ভারের মধ্যে বার্তা প্রেরণের জন্য এখানে। হতে পারে এই নিবন্ধটি পড়ুন enterprisewebbook.com/ch8_websockets.html
ইউনিসপো

19

পুরানো "এক্সপ্রেসগুলি", "অ্যাপ.জেএস" ফাইলটিতে সবকিছু ঘটছে। সুতরাং সকেট.ইও সার্ভারের সাথে আবদ্ধ হওয়াও সেই ফাইলটিতে ঘটে। (বিটিডাব্লু, এখনও এটি পুরানো উপায়ে করতে পারেন, এবং বিন / www সরিয়ে ফেলতে পারেন)

এখন নতুন এক্সপ্রেসগুলির সাথে এটি "বিন / www" ফাইলটিতে হওয়া দরকার।

ভাগ্যক্রমে, জাভাস্ক্রিপ্ট / প্রয়োজনীয়তাগুলি আশেপাশে বস্তুগুলি পাস করা সহজ করে তুলেছে। গ্যাব্রিয়েল হাটক্লোক্ক যেমন উল্লেখ করেছেন, সকেট.ইও এখনও "অ্যাপ্লিকেশন" তে "আমদানি করা" এবং এটি কোনও অ্যাপ্লিকেশনটির মাধ্যমে "অ্যাপ" অবজেক্টের সাথে সংযুক্ত হয়ে যায়

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

"বিন / www" এ সার্ভারটি সংযুক্ত করে সকেট.ইও লাইভ করা হয়

app.io.attach(server); 

কারণ "অ্যাপ্লিকেশন" অবজেক্টটি আগে "বিন / ডাব্লু" তে পাস হয়েছিল

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

এটা সত্যিই ঠিক হিসাবে সহজ

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

তবে এটি "কঠিন" উপায়ে করা নিশ্চিত করে যে app.ioএখন socke.io অবজেক্টটি ধারণ করে।

এখন উদাহরণস্বরূপ আপনার যদি এই সকেট.ইও অবজেক্টের প্রয়োজন হয় "রুটস / ইনডেক্স.জেজেস" তেও, কেবল সেই নীতিটি ব্যবহার করে সেই বিষয়টিকে চারপাশে পাস করুন।

"App.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" "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

সমস্ত মন্তব্য পড়ার পরে, আমি Socket.io সার্ভার সংস্করণ ব্যবহার করে নিম্নলিখিতটি নিয়ে এসেছি : 1.5.0

আমি যে বিষয়গুলিতে ছুটে এসেছি:

  1. var sockIO = প্রয়োজনীয় ('সকেট.আইও') হওয়া উচিত ভর সকিআইও = প্রয়োজন ('সকেট.আইও') () । (ক্রেডিট: ঝে হু )

  2. sockIO.attach সোকিআইও হওয়া উচিত।শুনুন (ক্রেডিট: রিক্রিজো )

পদক্ষেপ

  1. নিম্নলিখিত কমান্ড সহ Socket.io ইনস্টল করুন:

    npm install --save socket.io
    
  2. নিম্নলিখিতটি যুক্ত করুন App.js :

    var sockIO = require('socket.io')();
    app.sockIO = sockIO;
    
  3. ইন বিন / WWW পর Var সার্ভার = 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 ফাইলটি সম্পাদনা করুন এবং এই 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>

মজা করুন :) এবং সিড্রিক পাবস্টকে অনেক ধন্যবাদ


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

সম্পন্ন. আপনার সাইটে যান এবং ব্রাউজারের জেএস বিকাশকারী কনসোলটি পরীক্ষা করুন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.