【问题标题】:Wait for an event to trigger inside Node.js process等待事件在 Node.js 进程内触发
【发布时间】:2017-02-06 10:19:50
【问题描述】:

首先,我很清楚 Node.js 在其他任何事情之前都是非阻塞的,但在这种非常特殊的情况下,它必须在这里阻塞和等待。

我有一个以这种方式工作的身份验证过程(使用 API,我没有设计这个,所以我无法修改身份验证的工作方式):

我向 REST API 发送一个 PUT 请求,我得到一个 HTTPResponse 代码,用于确定 API 是否理解该请求。

我刚刚通过其 API 请求的服务器通过 XMPP 协议发送完整的响应(包括错误代码等)。

这意味着,当我发送请求时,我无法知道接下来发生了什么,必须等待 XMPP 事件触发(基本上是一个 on("message", callback) 事件)。

我想知道如何在 Node.js 中使用它。

还有两件事要知道:

1) 我正在研究客户端/服务器架构,我的 Node.js 服务器正在执行此身份验证过程,并且通过 websocket 向客户端发送响应并等待套接字答案是不可能的(不是我的电话,但我的老板希望这个过程一次性完成)。

2) 一定不能用客户端socket来做,因为各种原因必须经过完整的Node.js进程。

非常感谢您的帮助! \o/

【问题讨论】:

    标签: javascript node.js sockets authentication xmpp


    【解决方案1】:

    很抱歉之前没有回答,我们在工作中遇到了一些严重的硬件故障。 无论如何,我不会直接回答你的一个 cmets,因为我找到了我更喜欢的解决方案,即使我感谢你的帮助。我决定使用 Promise 并等待它的答案以确保得到正确的响应。

    代码如下:

    var answer = await new Promise((accept, reject) => {
    
        // If there are no stanza in 30 seconds, then the process failed or the stanza got missed.
    
        setTimeout(() => {
    
            reject("timed out");
    
        }, (30 * 1000));
    
        // Waiting for the xmpp event to trigger.
    
        xmpp.on("stanza", function(stanza) {
    
            // Processing of the received stanza goes here.
    
        });
    
    });
    

    @gkatzioura 的解决方案很有趣,但这看起来有点占用带宽,而且我们正在开发大规模的应用程序,或者我可能没有完全理解它,那么这是我的错误。

    @pspi 解决方案也很有趣,但考虑到 XMPP 事件侦听器在请求中,这将是一个问题,并且 PUT 请求需要在其 end() 事件上发送一个主体,而这里它实际上并不能用于什么我想要做。我认为那是因为我发的原始帖子有些不清楚。

    非常感谢你们的帮助! :]

    【讨论】:

      【解决方案2】:

      我不太了解 XMPP,但这只是“将依赖逻辑放入回调”的情况。

      request.put(..., function () {
          // dependent xmpp logic inside request callback
          xmpp.on(..., function () {
              // xmpp and put response received, now talk back to socket client
              socket.send(...);
          });
      });
      

      【讨论】:

        【解决方案3】:

        在您的情况下,我将继续进行事件 emitter(或任何以发布订阅方式的事件)。

        触发您的 http 调用并在处理程序中添加一个发射器侦听器,并检查事件是否用于相应的身份验证。 同时,您的 xmpp 连接一旦收到授权,它就会发出一条消息。 监听器会成功接收到消息,并会使用http调用的回调。

        【讨论】:

          猜你喜欢
          • 2019-06-11
          • 1970-01-01
          • 1970-01-01
          • 2012-07-09
          • 2017-08-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多