मैं NodeJS और Redis के साथ एक घटना-संचालित प्रकाशित / सदस्यता आवेदन लिख रहा हूं। मुझे एक उदाहरण की आवश्यकता है कि वेब क्लाइंट को कैसे सूचित करें जब Redis में डेटा मान बदलते हैं।
जवाबों:
मीडिया फायर से एक्सप्रेस , सॉकेट.आईओ , नोड_रेडिस और कम से कम नमूना कोड का उपयोग करता है ।
पहले आपको (यदि आपने अभी तक ऐसा नहीं किया है) नोड ( js ) + npm को 30 सेकंड में स्थापित करें (सही तरीके से क्योंकि आपको npm को रूट के रूप में नहीं चलाना चाहिए ):
echo 'export PATH=$HOME/local/bin:$PATH' >> ~/.bashrc
. ~/.bashrc
mkdir ~/local
mkdir ~/node-latest-install
cd ~/node-latest-install
curl http://nodejs.org/dist/node-latest.tar.gz | tar xz --strip-components=1
./configure --prefix=~/local
make install # ok, fine, this step probably takes more than 30 seconds...
curl http://npmjs.org/install.sh | sh
नोड + एनपीएम स्थापित करने के बाद आपको जारी करके निर्भरताएं स्थापित करनी चाहिए:
npm install express
npm install socket.io
npm install hiredis redis # hiredis to use c binding for redis => FAST :)
आप मीडियाफेयर से पूरा नमूना डाउनलोड कर सकते हैं ।
unzip pbsb.zip # can also do via graphical interface if you prefer.
./app.js
const PORT = 3000;
const HOST = 'localhost';
var express = require('express');
var app = module.exports = express.createServer();
app.use(express.staticProvider(__dirname + '/public'));
const redis = require('redis');
const client = redis.createClient();
const io = require('socket.io');
if (!module.parent) {
app.listen(PORT, HOST);
console.log("Express server listening on port %d", app.address().port)
const socket = io.listen(app);
socket.on('connection', function(client) {
const subscribe = redis.createClient();
subscribe.subscribe('pubsub'); // listen to messages from channel pubsub
subscribe.on("message", function(channel, message) {
client.send(message);
});
client.on('message', function(msg) {
});
client.on('disconnect', function() {
subscribe.quit();
});
});
}
./public/index.html
<html>
<head>
<title>PubSub</title>
<script src="/socket.io/socket.io.js"></script>
<script src="/javascripts/jquery-1.4.3.min.js"></script>
</head>
<body>
<div id="content"></div>
<script>
$(document).ready(function() {
var socket = new io.Socket('localhost', {port: 3000, rememberTransport: false/*, transports: ['xhr-polling']*/});
var content = $('#content');
socket.on('connect', function() {
});
socket.on('message', function(message){
content.prepend(message + '<br />');
}) ;
socket.on('disconnect', function() {
console.log('disconnected');
content.html("<b>Disconnected!</b>");
});
socket.connect();
});
</script>
</body>
</html>
cd pbsb
node app.js
यदि आप google chrome शुरू करते हैं तो सबसे अच्छा है (क्योंकि websockets समर्थन, लेकिन आवश्यक नहीं)। http://localhost:3000
नमूना देखने के लिए जाएँ (शुरुआत में आपको PubSub
शीर्षक के रूप में कुछ भी नहीं दिखता है )।
लेकिन publish
चैनल पर pubsub
आपको एक संदेश देखना चाहिए। नीचे हम "Hello world!"
ब्राउज़र पर प्रकाशित करते हैं।
publish pubsub "Hello world!"
यहाँ कई निर्भरता के बिना एक सरल उदाहरण है। आपको अभी भी जरूरत हैnpm install hiredis redis
नोड जावास्क्रिप्ट:
var redis = require("redis"),
client = redis.createClient();
client.subscribe("pubsub");
client.on("message", function(channel, message){
console.log(channel + ": " + message);
});
... एक pubsub.js फ़ाइल में रखें और चलाएं node pubsub.js
redis-cli में:
redis> publish pubsub "Hello Wonky!"
(integer) 1
जो प्रदर्शित होना चाहिए: pubsub: Hello Wonky!
टर्मिनल रनिंग नोड में! बधाई!
अतिरिक्त 4/23/2013: मैं यह भी नोट करना चाहता हूं कि जब कोई ग्राहक पब / सब चैनल को सब्सक्राइब करता है तो वह सब्सक्राइबर मोड में चला जाता है और सब्सक्राइबर कमांड तक सीमित रहता है। आपको केवल रेडिस क्लाइंट के अतिरिक्त इंस्टेंसेस बनाने की आवश्यकता होगी। client1 = redis.createClient(), client2 = redis.createClient()
तो एक ग्राहक मोड में हो सकता है और दूसरा नियमित डीबी कमांड जारी कर सकता है।
pubsub/*
सिर्फ जोड़ने p
उदाहरण के लिए: की जगह subscibe
के साथ psubscribe
और message
साथ pmessage
।
हम Redis Publish / Subscribe (" पब / सब ") को समझने की कोशिश कर रहे थे और सभी मौजूदा उदाहरण या तो पुराने थे, बहुत सरल या कोई परीक्षण नहीं था। इसलिए हमने एंड-टू-एंड टेस्ट के साथ Hapi.js + Socket.io + Redis Pub / Sub उदाहरण का उपयोग करके एक पूर्ण वास्तविक-समय चैट लिखा !
पब / सब कंपोनेंट केवल नोड.जेएस कोड की कुछ पंक्तियाँ है: https://github.com/dwyl/hapi-socketio-redis-chat-example/blob/master/lib/chat.js#L33-L40
यहां ( बिना किसी संदर्भ के ) इसे चिपकाने के बजाय हम आपको उदाहरण के लिए चेकआउट / प्रयास करने के लिए प्रोत्साहित करते हैं ।
हमने इसे Hapi.js का उपयोग करके बनाया था लेकिन chat.js
फ़ाइल Hapi से डी- कपल है और इसे आसानी से एक मूल नोड के साथ प्रयोग किया जा सकता है। http सर्वर या एक्सप्रेस (आदि)
नोडज को बाहर निकलने से रोकने के लिए रेडिस त्रुटियों को संभालें। आप यह लिखकर कर सकते हैं;
subcribe.on("error", function(){
//Deal with error
})
मुझे लगता है कि आपको अपवाद मिलता है क्योंकि आप उसी ग्राहक का उपयोग कर रहे हैं जो संदेशों को प्रकाशित करने के लिए सदस्यता लेता है। संदेश प्रकाशित करने के लिए एक अलग क्लाइंट बनाएँ और जो आपकी समस्या को हल कर सके।
GitHub पर अकानी-नोड की जाँच करें , विशेष रूप से फ़ाइल acani-node-server.js । यदि ये लिंक टूट गए हैं, तो Acani-chat-server की तलाश करें GitHub सार्वजनिक रिपॉजिटरी के acani तलाश करें ।
यदि आप इसे सॉकेट के साथ काम करना चाहते हैं। 0.7 और एक बाहरी वेबसर्वर जिसे आपको बदलने की आवश्यकता है (इसके अलावा स्थैतिक सर्वर -> स्थिर मुद्दा):
a) डोमेन नाम प्रदान करें index.html में स्थानीय (यानी var सॉकेट = io.connect ('http://my.domain.com:3000') के बजाय );
b) app.js में HOST बदलें (यानी const HOST = 'my.domain.com';)
c) और app.js (यानी 'socket.sockets.on (' कनेक्शन ', फंक्शन (क्लाइंट) {...') की पंक्ति 37 में सॉकेट जोड़ें
@alex समाधान के अनुसार । अगर आपको @tyler उल्लेख के अनुसार इस तरह एक त्रुटि है :
node.js:134
throw e; // process.nextTick error, or 'error'
event on first tick ^ Error: Redis connection to 127.0.0.1:6379 failed - ECONNREFUSED, Connection refused at Socket.
फिर आपको पहले Redis स्थापित करने की आवश्यकता है । इसकी जांच करें:
const client = redis.createClient()
app.js के मूल में क्यों आवश्यकता है?