2014-09-14 4 views
2

나는 app.get 내부 ZMQ 메시지를 보내려하지만 실행할 때 나는 오류가 발생 :Express 미들웨어에서 ZMQ 메시지를받는 방법은 무엇입니까?

events.js:72 
     throw er; // Unhandled 'error' event 
      ^
ReferenceError: res is not defined 

내 실행 코드 :

var zmq = require('zmq'), 
zreq = zmq.socket('req'), 
app = express(); 

zreq.connect('tcp://localhost:5559'); 

zreq.on('message', function (msg) { 
    res.writeHead(200, { 'Content-Type': 'application/json' }); 
    res.send(msg); 
}); 

app.get('/words', function (req, res) { 
    zreq.send('nodejs'); 
    //I think it should have something like zreqCallback(req)? 
}); 

답변

5

문제는 오류가 당신이 '돈 있음을 나타냅니다으로,이다 req 소켓의 message 이벤트 처리기에서 res 개체에 액세스 할 수 있습니다. 필요한 것은 해당 이벤트 처리기의 메시지를 res 개체에 연결하는 것입니다. 그 소켓의 다른 쪽 끝을지지하지 않고는 (쉽게) 할 수 없을 것입니다.

기본 아이디어는 zmq을 통해 보내는 각 메시지에 고유 ID를 연결하고 req 소켓을 통해 보낸 메시지와 rep 소켓에서 오는 응답에 포함시키는 것입니다. 그런 다음 res 개체를 동일한 메시지 ID와 연결합니다.

대개 고유 ID 생성에는 node-uuid을 사용합니다. 또한 메시지를 쉽게 인코딩/디코딩 할 수있는 방법이 필요합니다. (바로 그 순간 문자열을 보내는 것처럼 보입니다.) JSON 파서에 내장되어 있기 때문에 문제가 없으며 bencode 또는 protobuf과 같이 좀 더 조밀 한 것을 사용할 수도 있습니다. 소켓 양쪽 끝을 함께 사용할 수있는 것을 선택하십시오.

당신은 코드는 다음과 같을 것입니다 :

참고 : 나는 우리가 node-uuidJSON를 사용하고 있으리라 믿고있어. 또한 여기에 오류 처리 또는 온 전성 검사를 넣지는 않습니다. 그 물건을 잊지 마세요. 다른 쪽 끝에서

var zmq = require('zmq'), 
uuid = require('node-uuid'), 
zreq = zmq.socket('req'), 
app = express(); 

var responses = {}; 

zreq.connect('tcp://localhost:5559'); 

zreq.on('message', function (data) { 
    data = JSON.parse(data); 
    var msgId = data.id; 
    var res = responses[msgId]; 
    res.writeHead(200, { 'Content-Type': 'application/json' }); 
    res.send(data.message); 
    responses[msgId] = null; 
}); 

app.get('/words', function (req, res) { 
    var msgId = uuid.v4(); 
    var data = { id: msgId, message: 'nodejs' }; 
    responses[msgId] = res; 
    zreq.send(JSON.stringify(data)); 
}); 

(난 그냥 또한이 예제의 목적을 위해 노드로 작성 가정합니다) :

var zmq = require('zmq'); 
zrep = zmq.socket('rep'); 

zrep.bind('tcp://localhost:5559'); 

zrep.on('message', function(data) { 
    data = JSON.parse(data); 
    var msgId = data.id; 
    var msg = data.message; 

    // Do whatever you were doing before to process the message 
    // We'll say it ends up in a "results" variable 

    var response = { id: msgId, message: results }; 
    zrep.send(JSON.stringify(response)); 
}); 
+0

이 아래로 가지고 투표를하는 이유가 궁금 ...나요 나는 어딘가 쉬운 해결책을 놓치거나 잘 설명하지 못한다? –

+0

토론을 보려면 https://github.com/JustinTulloss/zeromq.node/issues/48을 참조하십시오. 이 방법 (또는 이와 유사한 방법)이 효과를 발휘할 수있는 유일한 방법 인 것 같습니다. 또한 어떤 종류의 messageId는 대리점/라우터 쌍에 필요하며 어쨌든 node.js와 함께 사용할 가능성이 더 큽니다. – user2362662

관련 문제