NodeJS 및 Redis를 사용하여 이벤트 기반 게시 / 구독 애플리케이션을 작성하고 있습니다. Redis의 데이터 값이 변경 될 때 웹 클라이언트에 알리는 방법에 대한 예제가 필요합니다.
답변
OLD는 참조 만 사용
의존성
용도는 표현 , Socket.IO에 , node_redis 는 AND 마지막으로 샘플 코드 미디어 화재를.
node.js + npm 설치 (루트가 아님)
먼저 (아직 수행하지 않은 경우) 30 초 내에 node.js + npm을 설치 해야합니다 ( 루트로 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 :)
샘플 다운로드
mediafire 에서 전체 샘플을 다운로드 할 수 있습니다 .
패키지 압축 해제
unzip pbsb.zip # can also do via graphical interface if you prefer.
zip 내부 내용
./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 크롬을 시작하는 것이 가장 좋습니다 (웹 소켓 지원 때문에 필요하지 않음). http://localhost:3000
샘플을 보려면 방문 하십시오 (처음 PubSub
에는 제목으로 만 표시 됩니다).
그러나 publish
채널 pubsub
에 메시지가 표시되어야합니다. 아래 "Hello world!"
에서 브라우저에 게시 합니다.
./redis-cli에서
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 명령을 실행할 수 있습니다.
답변
완전한 Redis Pub / Sub 예제 ( Hapi.js 및 Socket.io를 사용한 실시간 채팅 )
우리는 Redis Publish / Subscribe ( ” Pub / Sub “) 를 이해하려고 노력 했으며 기존의 모든 예제는 오래되었거나 너무 간단하거나 테스트가 없었습니다. 그래서 우리는 Hapi.js + Socket.io + Redis Pub / Sub 예제와 종단 간 테스트를 사용하여 완전한 실시간 채팅을 작성했습니다 !
Pub / Sub 구성 요소는 몇 줄의 node.js 코드입니다.
https://github.com/dwyl/hapi-socketio-redis-chat-example/blob/master/lib/chat.js#L33-L40
오히려 (여기에 붙여 넣기보다 어떤 맥락없이 ) 우리는 장려 / 체크 아웃에 당신을 시도 예 .
우리는 사용하여 내장 Hapi.js 하지만 chat.js
파일은 드 결합 게요!에서 할 수 있습니다 쉽게 와 함께 사용할 수 기본 Node.js를 HTTP 서버 또는 표현 (등)
답변
redis 오류를 처리하여 nodejs가 종료되지 않도록합니다. 당신은 글을 써서 이것을 할 수 있습니다;
subcribe.on("error", function(){
//Deal with error
})
메시지 게시를 구독하는 동일한 클라이언트를 사용하고 있기 때문에 예외가 발생한다고 생각합니다. 메시지 게시를위한 별도의 클라이언트를 생성하면 문제를 해결할 수 있습니다.
답변
GitHub의 acani-node , 특히 acani-node-server.js 파일을 확인하십시오 . 이러한 링크가 끊어 지면 acani의 GitHub 공개 저장소 중에서 acani -chat-server를 찾으십시오 .
답변
socket.io 0.7 및 외부 웹 서버 에서이 작업을 수행 하려면 변경해야합니다 (staticProvider-> 정적 문제 제외) :
a) 도메인 이름 제공 index.html에 localhost 대신 (예 : var socket = io.connect ( ‘http://my.domain.com:3000’);)을 제공합니다.
b) app.js에서 HOST 변경 (예 : const HOST = ‘my.domain.com’;)
c) app.js의 37 행 에 소켓 을 추가합니다 (예 : ‘socket.sockets.on (‘connection ‘, function (client) {…’)