等待事件在 Node.js 进程内触发

Wait for an event to trigger inside Node.js process

首先,我很清楚Node.js首先是非阻塞的,但是在这种非常特殊的情况下,它必须阻塞并在这里等待。

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

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

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

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

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

还有两件事要知道:

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

2) 不能通过客户端套接字完成,并且由于各种原因必须经过完整的 Node.js 过程。

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

我对 XMPP 了解不够,但这只是 "putting dependent logic inside callback" 的情况。

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(...);
    });
});

在你的情况下,我会继续事件 emitter(或发布订阅方式的任何事情)。

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

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

代码如下:

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() 事件上发送一个正文,在这里它不会真正起作用为了我想做的事。我认为那是因为我制作的原始post有点不清楚。

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