[javascript] 데이터 값이 변경되면 클라이언트에게 알리기 위해 nodejs와 함께 redis PUBLISH / SUBSCRIBE를 사용하는 방법은 무엇입니까?

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 예제와 종단 간 테스트를 사용하여 완전한 실시간 채팅을 작성했습니다 !

https://github.com/dwyl/hapi-socketio- redis-chat-example

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) {…’)


답변

코드 업데이트 :

staticProvider

이제 이름이

공전

마이그레이션 가이드 참조