【问题标题】:Node.js - How can I wait for something to be POSTed before I reply to a GETNode.js - 在回复 GET 之前如何等待发布内容
【发布时间】:2014-04-08 06:21:25
【问题描述】:

我有 2 个客户端和一个 node.js 服务器 url - localhost:8888/ServerRequest。第一个客户端从该 url 获取并等待 20 秒,以查看第二个客户端是否在 20 秒超时期限内为第一个客户端发布了一些数据。如果第二个客户端在超时之前进行了 POST,则返回该值GET 请求,否则返回 GET 请求的默认值。我不确定实现这一点的最佳方法是什么。我正在尝试这样的事情,但它没有按预期工作 -

function ServerRequest(response, postData , request)
{
    var id;
    if(request.method == "GET")
    {
        id= setTimeout(function( ) 
        {
            // handle timeout here
            console.log("Got a timeout, sending default value");
            cmd = "DefaultVal";

            response.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?><list id=\"20101001\"><com type=\"" + cmd + "\"></com></list>")
            response.end()
        },20000);
    }
    else if(request.method == "POST")
    {
        console.log("Received POST, sending POSTed value");
        cmd = postData;
        //Cancel Timeout
        clearTimeout(id);
        console.log(" \n Received POST")
        response.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?><list id=\"20101001\"><com type=\"" + cmd + "\"></com></list>")
        response.end()
    }
}

我想到的另一种方法是使用 2 个单独的 URL - 一个用于 GET 请求 (/ServerRequest),另一个用于 POST 请求 (/PostData)。但是,如果在超时之前收到,我将如何将 POSTed 数据从一个 URL 传递到另一个?

编辑:我想我现在知道我到底需要什么。我需要实现一个长轮询,客户端发送一个 GET 请求,并等待一个超时时间(数据可能无法立即使用,因此它等待 20 秒让其他客户端为第一个客户端发布一些数据消费)。如果发生超时,则返回默认值以响应来自第一个客户端的 GET 请求。我正在研究我找到的 here 的 longpoll 实现,如果我能够成功完成我正在尝试的事情,我会更新。如果有人能指点我或给我提供一个更好的例子,那将会很有帮助。

【问题讨论】:

    标签: node.js post get nonblocking


    【解决方案1】:

    编辑:在仔细阅读问题后删除了我的原始代码。

    最好的解决方案可能是websockets 浏览器将出现等待 20 秒的挂起。

    使用像socket.io 这样的库你可以做到这一点

    var io = require('socket.io').listen(8888);
    
    function postHandler(req, data, res){
            io.sockets.emit("response" , data)
    }
    

    然后是客户端

     <script src="/socket.io/socket.io.js"></script>
     <script>
      var socket = io.connect('http://localhost:8888');
      socket.on('response', function (data) {
         console.log(data);
      });
    </script>
    

    【讨论】:

    • 感谢您的回复。但我还想要的是,如果第二个客户端在 20 秒内没有发布任何内容,那么 GET 会以默认值响应。所以我还需要某种setTimeout,我不知道如何实现。
    • 您仍然可以使用套接字实现超时,但使用 Web 套接字您不会让浏览器挂起等待 20 秒
    • 我不是在写客户端,它们已经写好了,我只能将它们配置为在我的 URL 上获取和发布,我不确定它们是否使用套接字。我还能使用套接字吗?
    • 如果我知道您为什么希望客户等待 20 秒来发帖,我可能会提供更多有用的信息。这里的最终目标是什么?
    • 我刚刚添加了一个编辑,希望这会增加清晰度
    猜你喜欢
    • 2011-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-19
    • 2012-04-13
    • 1970-01-01
    • 2017-09-22
    • 1970-01-01
    相关资源
    最近更新 更多