【问题标题】:How can I set a timeout for a zmq request in Node.js?如何在 Node.js 中为 zmq 请求设置超时?
【发布时间】:2014-12-01 18:48:28
【问题描述】:

我编写了以下等待响应的代码。如果我在 5 秒后没有收到响应,如何注册超时回调?

var zmqRequest = zmq.socket('req');
zmqRequest.connect('tcp://localhost:8188');

zmqRequest.send(request.params.fileGuid);
console.log('request sent ' + request.params.fileGuid);

zmqRequest.on('message', function(msg){ // report back to the user... }); 

【问题讨论】:

  • 你找到答案了吗?我试过 socket.setsockopt(zmq.ZMQ_RCVTIMEO, 1000); socket.setsockopt(zmq.ZMQ_SNDTIMEO, 1000);但它似乎不起作用。
  • @FredMériot 我在下面添加了我的答案。

标签: node.js timeout zeromq


【解决方案1】:

我写了一个函数,它使用setTimeout 来检查超时请求。此示例使用 Typescript,但应该很容易转换为 vanilla javascript。

import * as zmq from 'zmq';

function sendZMQRequest(params:any, doneCallback:(error:any, results:any) => void):void{
    // init zmq socket.
    var zmqreq = zmq.socket('req');
    var connectAddress = 'tcp://0.0.0.0:8200';
    zmqreq.connect(connectAddress);

    // uses setTimeout later.
    var timeout;

    // callback for zmq response.
    var requestCallback = (response:Buffer) => {
        // clear the timer when a response comes back.
        clearTimeout(timeout);

        // parse response and add any error checking you might need.
        if(response){
            var parsedResp = JSON.parse(response.toString('utf8'));

            doneCallback(null, parsedResp);

        } else {
            doneCallback(new Error('Bad Response'), null);

        }
    };

    zmqreq.send(params);

    timeout = setTimeout(() => {
        zmqreq.close();
        zmqreq.removeListener('message', requestCallback);
        doneCallback(new Error('Request Timed Out After 3 Seconds'), null);
    }, 3000);

    zmqreq.on('message', requestCallback);
}

【讨论】:

    猜你喜欢
    • 2022-12-11
    • 2020-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多