2012-09-24 8 views
6

मैं एक्सप्रेसजेएस और सॉकेट.आईओ के आसपास अपना सिर लेने की कोशिश कर रहा हूं। लेकिन जब मैं कोशिश करते हैं और मेरी मार्गों में से एक से एक घटना फेंकना मैं socket.io के लिए कोई संदर्भएक्सप्रेसजेएस - रूट पृथक्करण के साथ सॉकेट.आईओ

var express = require('express')  
    , db = require('./db') 
    , mongoose = require('mongoose') 
    , models = require('./models/device') 
    , http = require('http') 
    , path = require('path') 
    , app = express() 
    , server = http.createServer(app) 
    , io = require('socket.io').listen(server) 
    , routes = require('./routes/myRoutes'); 

: मैं एक अलग फाइल में मेरे मार्गों जो मैं अपने app.js से शामिल मिल गया है।

exports.update = function(req, res){ 
    return Item.findById(req.params.id, function(err, item) { 
     // Do some checks and save. 
     socket.emit('updated'); 
    } 
} 

मुझे समझ में आता है कि यह क्यों उपलब्ध नहीं हो सकता है। बल्कि मुझे समझ में नहीं आता कि socket.io पर हैंडल प्राप्त करने का सबसे अच्छा तरीका app.js. के अलावा किसी अन्य फ़ाइल से है। मैं this question देख रहा था (रिकार्डो का जवाब देखें) लेकिन मैं अभी भी स्पष्ट नहीं हूं। आदर्श रूप में मैं ऐसा करने से बचना चाहता हूं:

मार्ग = आवश्यक ("मार्ग/myRoutes") (io);

+0

आप http मॉड्यूल का उपयोग करने से बच सकते हैं, हालांकि socket.io को एक HTTP सर्वर की आवश्यकता है जिसे आप इसे एक्सप्रेस निर्भरता (3.xx) से कॉल कर सकते हैं: var app = express(), server = app.listen (3000), io = socket.listen (सर्वर); –

+0

अद्यतन: feathers.js – backdesk

उत्तर

5

बाहर चेक express.io

यह वास्तविक समय अनुरोधों के लिए मार्ग है, और अन्य उपयोगी सुविधाओं में से एक गुच्छा।

app = require('express.io')() 
app.http().io() 

app.io.route('example', function(req) { 
    // do something interesting 
})) 

app.listen(7076) 

जहां तक ​​io ऑब्जेक्ट को पास करने के आसपास हो रहा है। आपके पास कुछ विकल्प हैं, जो आपसे पूछते हैं कि "सर्वश्रेष्ठ" हो सकता है या नहीं।

  • io या app वैश्विक बनाएं। (कुछ लोग ग्लोबल्स से बाहर निकलते हैं)
  • अन्य फ़ाइल में ऑब्जेक्ट module.exports और require का उपयोग करें। (यदि सही तरीके से नहीं किया जाता है तो परिपत्र निर्भरता के मुद्दों का कारण बन सकता है)

io ऑब्जेक्ट पास करना शायद सबसे आसान तरीका है, लेकिन आपके पास विकल्प हैं।

+1

मृत लिंक। Depreceated? – Keith

+0

express.io लिंक मृत, यह एक्सप्रेस-io.org –

2

socket.io मार्गों के साथ काम नहीं करता है, यह सॉकेट के साथ काम करता है।

आप app.js के लिए इस कोड या एक अलग फाइल जो आप app.js में शामिल जोड़ें:

io.sockets.on('connection', function (socket) { 
    socket.on('update', function (your_id) { 
    Item.findById(your_id, function(err, item) { 
     socket.emit('send_update', item); 
    } 
    }); 
}); 

आपका अद्यतन मार्ग केवल जावास्क्रिप्ट के साथ एक HTML दस्तावेज़ प्रस्तुत हुई है, युक्त

<script src="/socket.io/socket.io.js"></script> 
<script> 
    var socket = io.connect('http://localhost'); 
    socket.emit('update', { your_id: '1' }); 
    socket.on('send_update', function (data) { 
    console.log(data); 
    }); 
</script> 

तो एक बार पृष्ठ प्रस्तुत और पूरा हो जाने पर, क्लाइंट-जावास्क्रिप्ट सर्वर पर सॉकेट खोल देगा और अतिरिक्त डेटा प्राप्त करेगा।

देखें more examples here.

अस्वीकरण: कोड खरोंच से लिखा गया है और परीक्षण नहीं किया।

+0

समझाएं पर एक नज़र डालें। मेरा एक्सप्रेस ऐप केवल एक आरामदायक एपीआई के रूप में कार्य करता है, इसलिए डिफॉल्ट के अलावा अन्य दृश्यों पर बहुत कुछ नहीं चल रहा है। एक बार रिकॉर्ड बदल जाने के बाद मैं एक घटना को उत्सर्जित करना चाहता था - मुझे यकीन नहीं था कि मुझे सर्वर से अधिसूचना भेजनी चाहिए (एक बार यह सहेजा गया है) या ग्राहक। – backdesk

+0

आप एक्सप्रेस में एक। पोस्ट-रूट के साथ ऐसा कर सकते हैं और एक [jQuery] (http://api.jquery.com/change/)/[AJAX] (http://api.jquery.com/jQuery.post /) उपाय। Socket.io से बेहतर हो सकता है। – Patrick

2

बंद करने का सबसे अच्छा तरीका है। उदाहरण के लिए:

exports.update = function(socket){ 
    return function(req, res) { 
    //In here now you can have the reference to the socket io 
    Item.findById(req.params.id, function(err, item) { 
     // Do some checks and save. 
     socket.emit('updated'); 
    } 
    } 
} 

और:

app.post('/your_path', update(io)); 
9

वैसे आप वास्तव में उस के लिए express.io जरूरत नहीं है। सबसे आसान समाधान एक नया मॉड्यूल निर्यात करना होगा और इसे socket.io उदाहरण के संदर्भ में पास करना होगा। तो आपके ऐप में।जेएस आपके पास है:

var express = require('express'), 
    ... 
    , server = http.createServer(app) 
    , io = require('socket.io').listen(server) 
    , routes = require('./routes/myRoutes'); 

अब एक नया मॉड्यूल की आवश्यकता है और इसे सॉकेटियो संदर्भ पास करें। इस नई लाइन (app.js में) ऐसा करने के लिए जोड़ें:

require('./app/path/to/your/socketio/controller/socketio')(io); 

फिर अपने path/to/your/socketio/controller बुलाया socketio.js

और अंत में socketio.js फ़ाइल में में एक नई फ़ाइल बनाना, अपने नए मॉड्यूल का निर्यात :

module.exports = function(io) { 

    io.sockets.on('connection', function (socket) { 

     socket.on('captain', function(data) { 

      console.log(data); 

      socket.emit('america'); 
     }); 
    }); 
}; 

और वहां आप जाते हैं!

+0

पर रीडायरेक्ट कर रहा है उदाहरण के लिए धन्यवाद। क्या आप अभिव्यक्ति की आवश्यकता पर आगे विस्तार कर सकते हैं? मैं एक शुद्ध सॉकेट-आधारित समाधान को लागू करने के तरीकों के बारे में थोड़ी देर के लिए सोच रहा था। – backdesk

+2

यह "sockets.js" मॉड्यूल रणनीति गितूब पर बहुत लोकप्रिय दिखती है, लेकिन मेरे जीवन के लिए - मैं समझ नहीं पा रहा हूं कि मार्ग फ़ाइल (उदा ./routes/myRoutes) के बाद उस मॉड्यूल (sockets.js) तक पहुंच होगी। :( –

0

मैंने Expressjs (मैं 4.x का उपयोग कर रहा हूं) के मिडलवेयर राउटर का उपयोग किया है।

बाहरी मार्ग फ़ाइल मैं "अगला" वस्तु डाल में:

module.exports = function(app, settings){ 
    app.post('/something', function(req, res, next) { 
    ... 
    next(); 
    } 
}; 

और मुख्य फ़ाइल में मैं io.on अंदर पिछले मार्ग हॉप बारे में ('कनेक्शन'):

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

    // Final route for middlewares who need to interact with socket.io 
    app.post('/something', function (req, res, next) { 
     socket.emit('event', { result: 'ok' }); 
    }); 

}); 
संबंधित मुद्दे