Tôi đang viết một ứng dụng đăng ký / xuất bản theo hướng sự kiện với NodeJS và Redis. Tôi cần một ví dụ về cách thông báo cho khách hàng web khi giá trị dữ liệu trong Redis thay đổi.
Tôi đang viết một ứng dụng đăng ký / xuất bản theo hướng sự kiện với NodeJS và Redis. Tôi cần một ví dụ về cách thông báo cho khách hàng web khi giá trị dữ liệu trong Redis thay đổi.
Câu trả lời:
sử dụng express , socket.io , node_redis và mã mẫu cuối cùng nhưng không kém phần quan trọng từ media fire.
Trước tiên, bạn nên (nếu bạn chưa làm điều này) cài đặt node.js + npm trong 30 giây (đúng cách vì bạn KHÔNG nên chạy npm dưới dạng root ):
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
Sau khi bạn cài đặt node + npm, bạn nên cài đặt các phụ thuộc bằng cách phát hành:
npm install express
npm install socket.io
npm install hiredis redis # hiredis to use c binding for redis => FAST :)
Bạn có thể tải xuống mẫu hoàn chỉnh từ mediafire .
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
Tốt nhất nếu bạn khởi động google chrome (vì hỗ trợ websockets, nhưng không cần thiết). Truy cập http://localhost:3000
để xem mẫu (ban đầu bạn không thấy gì ngoàiPubSub
tiêu đề).
Nhưng trên publish
kênh, pubsub
bạn sẽ thấy một thông báo. Dưới đây chúng tôi xuất bản "Hello world!"
lên trình duyệt.
publish pubsub "Hello world!"
đây là một ví dụ đơn giản mà không có nhiều phụ thuộc. Bạn vẫn cầnnpm install hiredis redis
JavaScript nút:
var redis = require("redis"),
client = redis.createClient();
client.subscribe("pubsub");
client.on("message", function(channel, message){
console.log(channel + ": " + message);
});
... đặt nó vào tệp pubsub.js và chạy node pubsub.js
trong redis-cli:
redis> publish pubsub "Hello Wonky!"
(integer) 1
sẽ hiển thị: pubsub: Hello Wonky!
trong nút đang chạy của thiết bị đầu cuối! Chúc mừng!
Bổ sung 23/4/2013: Tôi cũng muốn lưu ý rằng khi khách hàng đăng ký kênh pub / sub, nó sẽ chuyển sang chế độ người đăng ký và bị giới hạn ở lệnh đăng ký. Bạn chỉ cần tạo thêm các phiên bản redis client. client1 = redis.createClient(), client2 = redis.createClient()
vì vậy một người có thể ở chế độ thuê bao và người kia có thể đưa ra các lệnh DB thông thường.
pubsub/*
chỉ thêm p
vào ví dụ: thay thế subscibe
bằng psubscribe
và message
bằng pmessage
.
Chúng tôi đang cố gắng hiểu Redis Publish / Subscribe (" Pub / Sub ") và tất cả các ví dụ hiện có đều đã lỗi thời, quá đơn giản hoặc không có thử nghiệm. Vì vậy, chúng tôi đã viết một cuộc trò chuyện hoàn chỉnh trong thời gian thực bằng Hapi.js + Socket.io + Redis Pub / Sub Ví dụ với các bài kiểm tra từ đầu đến cuối !
Thành phần Pub / Sub chỉ là một vài dòng mã node.js: https://github.com/dwyl/hapi-socketio-redis-chat-example/blob/master/lib/chat.js#L33-L40
Thay vì dán nó ở đây ( không có bất kỳ ngữ cảnh nào ), chúng tôi khuyến khích bạn kiểm tra / thử ví dụ .
Chúng tôi đã xây dựng nó bằng cách sử dụng Hapi.js nhưng chat.js
tệp được loại bỏ khỏi Hapi và có thể dễ dàng được sử dụng với máy chủ http node.js cơ bản hoặc express (v.v.)
Xử lý lỗi redis để ngăn nodejs thoát. Bạn có thể làm điều này bằng cách viết;
subcribe.on("error", function(){
//Deal with error
})
Tôi nghĩ rằng bạn nhận được ngoại lệ vì bạn đang sử dụng cùng một ứng dụng được đăng ký để xuất bản tin nhắn. Tạo một khách hàng riêng để xuất bản tin nhắn và điều đó có thể giải quyết vấn đề của bạn.
Kiểm tra acani-node trên GitHub , đặc biệt là tệp acani-node-server.js . Nếu các liên kết này bị hỏng, hãy tìm acani-chat-server trong số các kho lưu trữ công khai GitHub của acani .
Nếu bạn muốn điều này hoạt động với socket.io 0.7 VÀ một máy chủ web bên ngoài, bạn cần thay đổi (ngoài staticProvider -> sự cố tĩnh):
a) cung cấp tên miền thay vì localhost (tức là var socket = io.connect ('http://my.domain.com:3000');) trong index.html
b) thay đổi HOST trong app.js (tức là const HOST = 'my.domain.com';)
c) và thêm các ổ cắm vào dòng 37 của app.js (tức là 'socket.sockets.on (' kết nối ', hàm (máy khách) {…')
const client = redis.createClient()
trong thư mục gốc của app.js?