আমি নোডজেএস এবং রেডিসের সাথে ইভেন্ট-চালিত প্রকাশ / সাবস্ক্রাইব অ্যাপ্লিকেশন লিখছি। রেডিসে ডেটার মান পরিবর্তিত হলে ওয়েব ক্লায়েন্টকে কীভাবে জানাতে হয় তার একটি উদাহরণ আমার দরকার।
উত্তর:
ব্যবহারসমূহ প্রকাশ , socket.io , node_redis এবং শেষ কিন্তু না অন্তত নমুনা কোড মিডিয়া ফায়ার থেকে।
প্রথমে আপনার (যদি আপনি এটি এখনও না করেন) 30 সেকেন্ডে নোড.জেএস + এনপিএম ইনস্টল করা উচিত ( সঠিক উপায় কারণ আপনাকে এনটিএম রুট হিসাবে চালানো উচিত নয় ):
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
সেরা আপনি যদি গুগল ক্রোম শুরু করেন (ওয়েবসকেট সমর্থনের কারণে, তবে প্রয়োজনীয় নয়)। পরিদর্শন 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> publish pubsub "Hello Wonky!"
(integer) 1
যা প্রদর্শিত হবে: pubsub: Hello Wonky!
টার্মিনাল চলমান নোড! অভিনন্দন!
অতিরিক্ত 4/23/2013: আমি এটিও নোট করতে চাই যে যখন কোনও ক্লায়েন্ট কোনও পাব / সাব চ্যানেলে সাবস্ক্রাইব করে তখন এটি গ্রাহক মোডে চলে যায় এবং গ্রাহক আদেশে সীমাবদ্ধ থাকে। আপনার কেবলমাত্র redis ক্লায়েন্টদের অতিরিক্ত দৃষ্টান্ত তৈরি করতে হবে। client1 = redis.createClient(), client2 = redis.createClient()
যাতে একজন গ্রাহক মোডে থাকতে পারে এবং অন্যটি নিয়মিত ডিবি কমান্ড জারি করতে পারে।
pubsub/*
কেবল যুক্ত p
করতে সাবস্ক্রাইব করুন : subscibe
সাথে psubscribe
এবং message
সাথে প্রতিস্থাপন করুন pmessage
।
আমরা রেডিস পাবলিকেশন / সাবস্ক্রাইব (" পাব / সাব ") বোঝার চেষ্টা করছিলাম এবং বিদ্যমান সমস্ত উদাহরণগুলি পুরানো, খুব সাধারণ বা কোনও পরীক্ষা ছিল না। সুতরাং আমরা Hapi.js + Socket.io + Redis পাব / সাব-টু-এন্ড টেস্ট সহ সাব উদাহরণ ব্যবহার করে একটি সম্পূর্ণ রিয়েল-টাইম চ্যাট লিখেছি !
পাব / সাব উপাদানটি নোড.জেএস কোডের কয়েকটি লাইন: https://github.com/dwyl/hapi-socketio-redis-chat-example/blob/master/lib/chat.js#L33-L40
এখানে এটি আটকে দেয়ার পরিবর্তে ( কোনও প্রসঙ্গ ছাড়াই ) আমরা আপনাকে চেকআউট / উদাহরণটি দেখতে উত্সাহিত করি ।
আমরা এটি Hapi.js ব্যবহার করে তৈরি করেছি তবে chat.js
ফাইলটি হপি থেকে ডি-কাপলড এবং সহজেই একটি বেসিক নোড.জেএসপি HTTP সার্ভার বা এক্সপ্রেস (ইত্যাদি) এর সাথে ব্যবহার করা যেতে পারে
নোডেজগুলি প্রস্থান করা থেকে বিরত রাখতে পুনরায় ত্রুটিগুলি পরিচালনা করুন। আপনি লিখে লিখে এটি করতে পারেন;
subcribe.on("error", function(){
//Deal with error
})
আমি মনে করি আপনি ব্যতিক্রম পেয়েছেন কারণ আপনি একই ক্লায়েন্টটি ব্যবহার করছেন যা বার্তা প্রকাশের জন্য সাবস্ক্রাইব হয়েছে। বার্তা প্রকাশের জন্য একটি পৃথক ক্লায়েন্ট তৈরি করুন এবং এটি আপনার সমস্যার সমাধান করতে পারে।
পরীক্ষা করে দেখুন GitHub থেকে acani-নোড , বিশেষ করে ফাইল acani-নোড-server.js । যদি এই লিঙ্কগুলি নষ্ট হয়ে যায়, তবে অ্যাকানির গিটহাব পাবলিক ভান্ডারগুলির মধ্যে আকানী -চ্যাট-সার্ভারটি সন্ধান করুন ।
আপনি যদি এটি সকেট.ইও 0.7 এবং একটি বাহ্যিক ওয়েবসভার দিয়ে কাজ করতে চান তবে আপনাকে পরিবর্তন করতে হবে (স্ট্যাটিকপ্রাইডার -> স্ট্যাটিক সমস্যা ছাড়াও):
ক) সূচক html এ লোকালহোস্টের পরিবর্তে ডোমেন নাম সরবরাহ করুন (যেমন var সকেট = io.connect ('http://my.domain.com:3000');)
খ) অ্যাপ.জেজে HOST পরিবর্তন করুন (যেমন কনস্ট HOST = 'my.domain.com';)
সি) এবং অ্যাপ্লিকেশনসমূহের লাইনে 37 সকেট যুক্ত করুন (যেমন 'সকেট.সকেটস.অন (' সংযোগ ', ফাংশন (ক্লায়েন্ট) {…'))
@alex সমাধান অনুযায়ী । আপনার যদি @ টিলার উল্লেখ অনুসারে এর মতো ত্রুটি থাকে :
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.
তারপরে আপনাকে প্রথমে রেডিস ইনস্টল করতে হবে । এটা দেখ:
const client = redis.createClient()
app.js এর মূলের দরকার কেন ?