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

Posted

技术标签:

【中文标题】等待事件在 Node.js 进程内触发【英文标题】:Wait for an event to trigger inside Node.js process 【发布时间】: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/

【问题讨论】:

【参考方案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调用的回调。

【讨论】:

以上是关于等待事件在 Node.js 进程内触发的主要内容,如果未能解决你的问题,请参考以下文章

node.js 返回客户端等待事件

将 Node.js 流错误事件传播到异步等待样式代码

理解 node.js 的事件循环

linux进程D状态_转

理解Node.js的事件轮询

node.js基础