ฉันกำลังเขียนแอปพลิเคชันเผยแพร่ / สมัครสมาชิกตามเหตุการณ์ด้วย NodeJS และ Redis ฉันต้องการตัวอย่างวิธีแจ้งเว็บไคลเอนต์เมื่อค่าข้อมูลใน Redis เปลี่ยนแปลง
ฉันกำลังเขียนแอปพลิเคชันเผยแพร่ / สมัครสมาชิกตามเหตุการณ์ด้วย NodeJS และ Redis ฉันต้องการตัวอย่างวิธีแจ้งเว็บไคลเอนต์เมื่อค่าข้อมูลใน Redis เปลี่ยนแปลง
คำตอบ:
ใช้express , socket.io , node_redisและสุดท้าย แต่ไม่ท้ายสุดคือโค้ดตัวอย่างจากไฟไหม้สื่อ
ก่อนอื่นคุณควร (ถ้าคุณยังไม่ได้ทำ) ติดตั้งnode.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
หลังจากคุณติดตั้ง node + npm คุณควรติดตั้งการอ้างอิงโดยการออก:
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
โหนด JavaScript:
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:ฉันต้องการทราบด้วยว่าเมื่อลูกค้าสมัครสมาชิกช่อง pub / sub ระบบจะเข้าสู่โหมดสมาชิกและถูก จำกัด ไว้ที่คำสั่งของสมาชิก คุณจะต้องสร้างอินสแตนซ์เพิ่มเติมของไคลเอนต์ redis client1 = redis.createClient(), client2 = redis.createClient()
เพื่อให้สามารถอยู่ในโหมดสมาชิกและอีกคนหนึ่งสามารถออกคำสั่ง DB ปกติได้
pubsub/*
เพียงแค่เพิ่มp
ไปตัวอย่าง: แทนที่subscibe
ด้วยpsubscribe
และมีmessage
pmessage
เราพยายามทำความเข้าใจ Redis Publish / Subscribe (" Pub / Sub ") และตัวอย่างทั้งหมดที่มีอยู่นั้นล้าสมัยเรียบง่ายเกินไปหรือไม่มีการทดสอบใด ๆ ดังนั้นเราจึงเขียนการแชทแบบเรียลไทม์ที่สมบูรณ์โดยใช้ Hapi.js + Socket.io + Redis Pub / Sub ตัวอย่างด้วย End-to-End Tests !
องค์ประกอบ Pub / Sub เป็นโค้ด node.js เพียงไม่กี่บรรทัด: https://github.com/dwyl/hapi-socketio-redis-chat-example/blob/master/lib/chat.js#L33-L40
แทนที่จะวางนี่ ( โดยไม่มีบริบทใด ๆ ) เราขอแนะนำให้คุณเช็คเอาต์ / ลองยกตัวอย่างเช่น
เราสร้างมันขึ้นมาโดยใช้Hapi.jsแต่chat.js
ไฟล์de-ควบคู่ไปจากขั้นตอนที่สามารถได้อย่างง่ายดายใช้กับพื้นฐาน Node.js http เซิร์ฟเวอร์หรือแสดง (อื่น ๆ )
จัดการข้อผิดพลาด redis เพื่อหยุดการออกจาก nodejs คุณสามารถทำได้โดยการเขียน;
subcribe.on("error", function(){
//Deal with error
})
ฉันคิดว่าคุณได้รับข้อยกเว้นเนื่องจากคุณใช้ไคลเอนต์เดียวกันซึ่งสมัครรับข้อมูลเพื่อเผยแพร่ข้อความ สร้างไคลเอนต์แยกต่างหากสำหรับการเผยแพร่ข้อความและสามารถแก้ปัญหาของคุณได้
ตรวจสอบacani โหนดบน GitHubโดยเฉพาะไฟล์acani โหนด-server.js ถ้าเชื่อมโยงเหล่านี้จะถูกแบ่งให้มองหา acani แชทเซิร์ฟเวอร์ในหมู่acani ของ GitHub เก็บสาธารณะ
หากคุณต้องการให้สิ่งนี้ทำงานกับ socket.io 0.7 และเว็บเซิร์ฟเวอร์ภายนอกคุณต้องเปลี่ยน (นอกเหนือจาก staticProvider -> ปัญหาคงที่):
ก) ระบุชื่อโดเมนแทน localhost (เช่น var socket = io.connect ('http://my.domain.com:3000');) ใน index.html
b) เปลี่ยน HOST ใน app.js (เช่น const HOST = 'my.domain.com';)
c) และเพิ่มซ็อกเก็ตในบรรทัดที่ 37 ของ app.js (เช่น 'socket.sockets.on (' connection ', function (client) {…')
const client = redis.createClient()
ในรูทของ app.js