等待事件在 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 进程内触发的主要内容,如果未能解决你的问题,请参考以下文章