2015-03-29 17 views
9

के साथ सॉकेट्स मैं express.js 4 का उपयोग करके वास्तव में एक साधारण नोड एपीआई बनाने की कोशिश कर रहा हूं लेकिन मुझे कुछ 'रीयलटाइम' ईवेंट की आवश्यकता है जिसके लिए मैंने socket.io जोड़ा है। मैं दोनों के लिए काफी नया हूं इसलिए मुझे कुछ मूलभूत याद आ रही है लेकिन मुझे इस पर अच्छे दस्तावेज़/टट्स नहीं मिल रहे हैं।express.js 4 और एक्सप्रेस राउटर

एक्सप्रेस ऐप (एक्सप्रेस जनरेटर के साथ बनाया गया) में मेरे पास कुछ सरल उदाहरण और प्रोजेक्ट दस्तावेज़ों के आधार पर ऐसा कुछ है जो मैंने पढ़ा है। यह ठीक काम करता है और ग्राहक क्षुधा से, मैं भेज/सॉकेट ईवेंट प्राप्त कर सकते हैं:

var express = require('express'); 
var path = require('path'); 
var logger = require('morgan'); 
var api = require('./routes/api'); 
var app = express(); 
var io = require('socket.io').listen(app.listen(3000)); 

app.use(logger('dev')); 
app.use(express.static(path.join(__dirname, 'public'))); 
app.use('/api', api); 

io.sockets.on('connection', function (socket) { 
    console.log('client connect'); 
    socket.on('echo', function (data) { 
     io.sockets.emit('message', data); 
    }); 
}); 


// error handlers omitted 

module.exports = app; 

लेकिन मैं अपने एपीआई मार्गों से सॉकेट (./routes/api.js फ़ाइल में है कि मैं की आवश्यकता का उपयोग करना चाहते ' ऊपर)। उदाहरण के लिए, कोई व्यक्ति संसाधन को PUT/POST करने के लिए API का उपयोग कर सकता है और मैं चाहता हूं कि वह socket.io क्लाइंट से कनेक्ट हो।

मैं नहीं देख सकता कि 'io' चर का उपयोग कैसे करें या वर्तमान में io.sockets.on('connection' ... एक्सप्रेस मार्गों के भीतर कोड को व्यवस्थित करें। आप जाँच कर सकते हैं अगर यह काम करता है

var express = require('express'); 
var router = express.Router(); 
var io = ???; 

router.put('/foo', function(req, res) { 
    /* 
     do stuff to update the foo resource 
     ... 
    */ 

    // now broadcast the updated foo.. 
    io.sockets.emit('update', foo); // how? 
}); 

module.exports = router; 

उत्तर

8

मैं अपनी फ़ाइलें एक छोटा सा संशोधन किया है,: यहाँ ./routes/api.js फ़ाइल है?

आप अपने मार्गों को नीचे दिए गए io को पारित कर सकते हैं;

require('./routes/api')(app,io); 

मैंने सॉकेट.आईओ भागों का परीक्षण नहीं किया लेकिन कोई वाक्यविन्यास त्रुटि नहीं है और मार्ग भी काम कर रहे हैं।

server.js फ़ाइल:

var express = require('express'); 
var app = express(); 
var path = require('path'); 
var logger = require('morgan'); 

var io = require('socket.io').listen(app.listen(3000)); 

app.use(logger('dev')); 
app.use(express.static(path.join(__dirname, 'public'))); 

io.sockets.on('connection', function (socket) { 
    console.log('client connect'); 
    socket.on('echo', function (data) { 
    io.sockets.emit('message', data); 
}); 
}); 

require('./routes/api')(app,io); 

console.log("Server listening at port 3000"); 

api.js:

module.exports = function(app,io) { 
app.put('/foo', function(req, res) { 

    /* 

     do stuff to update the foo resource 

     ... 

    */ 


    // now broadcast the updated foo.. 

    console.log("PUT OK!"); 

    io.sockets.emit('update'); // how? 
    res.json({result: "update sent over IO"}); 

}); 
} 
+1

धन्यवाद Caner। यह काम करता है और कुछ मामूली बदलावों के साथ मैं इसका उपयोग कर सकता हूं क्योंकि यह विशेष ऐप काफी सरल है। लेकिन जैसा कि मैं कुछ सर्वोत्तम प्रथाओं को सीखने के लिए इसका उपयोग करने की कोशिश कर रहा हूं, क्या एक्सप्रेस राउटर() का उपयोग जारी रखने का कोई तरीका है? यह एक्सप्रेस 4.x के लिए जाने का बेवकूफ तरीका प्रतीत होता है। – darrend

+0

@ डेरेंड, एक्सप्रेस.जेएस दस्तावेजों के मुताबिक ऐसा लगता है कि http://expressjs.com/api.html की तरह उपयोग करना ठीक है, आपको क्या लगता है? – cdagli

+0

यह उचित है - मैं दस्तावेज़ों और कोड में स्वीकार्य और खुदाई के रूप में चिह्नित करूंगा। सहायता के लिए धन्यवाद। – darrend

14

एक विकल्प अनुरोध वस्तु में इसे पारित करने के लिए है।

app.js:

var express = require('express'); 
var path = require('path'); 
var logger = require('morgan'); 
var api = require('./routes/api'); 
var app = express(); 
var io = require('socket.io').listen(app.listen(3000)); 

app.use(logger('dev')); 
app.use(express.static(path.join(__dirname, 'public'))); 

io.sockets.on('connection', function (socket) { 
    console.log('client connect'); 
    socket.on('echo', function (data) { 
     io.sockets.emit('message', data); 
    }); 
}); 

// Make io accessible to our router 
app.use(function(req,res,next){ 
    req.io = io; 
    next(); 
}); 

app.use('/api', api); 

// error handlers omitted 

module.exports = app; 

./routes/api.js:

var express = require('express'); 
var router = express.Router(); 

router.put('/foo', function(req, res) { 
    /* 
     do stuff to update the foo resource 
     ... 
    */ 

    // now broadcast the updated foo.. 
    req.io.sockets.emit('update', foo); 
}); 

module.exports = router; 
+0

क्या आपको वास्तव में उपरोक्त कोड काम करने के लिए मिला? मेरे अनुरोध पर io मेरे राउटर कोड – atsituab

+0

अप में अपरिभाषित के रूप में दिखता रहता है मुझे वहां कोई गलती थी - भाग '// हमारे राउटर के लिए सुलभ बनाने योग्य' को 'app.use ('/api ', api) से पहले परिभाषित किया जाना चाहिए; ' – platlas

संबंधित मुद्दे