문제는 오류가 당신이 '돈 있음을 나타냅니다으로,이다 req
소켓의 message
이벤트 처리기에서 res
개체에 액세스 할 수 있습니다. 필요한 것은 해당 이벤트 처리기의 메시지를 res
개체에 연결하는 것입니다. 그 소켓의 다른 쪽 끝을지지하지 않고는 (쉽게) 할 수 없을 것입니다.
기본 아이디어는 zmq
을 통해 보내는 각 메시지에 고유 ID를 연결하고 req
소켓을 통해 보낸 메시지와 rep
소켓에서 오는 응답에 포함시키는 것입니다. 그런 다음 res
개체를 동일한 메시지 ID와 연결합니다.
대개 고유 ID 생성에는 node-uuid을 사용합니다. 또한 메시지를 쉽게 인코딩/디코딩 할 수있는 방법이 필요합니다. (바로 그 순간 문자열을 보내는 것처럼 보입니다.) JSON
파서에 내장되어 있기 때문에 문제가 없으며 bencode 또는 protobuf과 같이 좀 더 조밀 한 것을 사용할 수도 있습니다. 소켓 양쪽 끝을 함께 사용할 수있는 것을 선택하십시오.
당신은 코드는 다음과 같을 것입니다 :
참고 : 나는 우리가 node-uuid
및 JSON
를 사용하고 있으리라 믿고있어. 또한 여기에 오류 처리 또는 온 전성 검사를 넣지는 않습니다. 그 물건을 잊지 마세요. 다른 쪽 끝에서
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));
});
이 아래로 가지고 투표를하는 이유가 궁금 ...나요 나는 어딘가 쉬운 해결책을 놓치거나 잘 설명하지 못한다? –
토론을 보려면 https://github.com/JustinTulloss/zeromq.node/issues/48을 참조하십시오. 이 방법 (또는 이와 유사한 방법)이 효과를 발휘할 수있는 유일한 방법 인 것 같습니다. 또한 어떤 종류의 messageId는 대리점/라우터 쌍에 필요하며 어쨌든 node.js와 함께 사용할 가능성이 더 큽니다. – user2362662