我正在尝试根据来自 EventEmitter 事件的信息呈现页面。如何解决这个问题?

I am trying to render a page based upon information from an EventEmitter's events. How to approach this?

我正在使用 express 呈现一个页面,其中包含一些 html 是根据从 eventEmitter 中提取的信息构建的。

基本上现在的代码是这样的:

app.post("/login", (req, res) => {
  let factory = eventFactory(args);
  let client = factory.client();
  let html;
  client.once(client.Event.Ready, function() {
                                            html = buildHTML(someArgs);
                                            res.render("page", {html: html});
                                            })
}

这一次画得很好。但是,我想让页面根据新事件重绘。我知道我可以使用 client.on() 在每个接收到的事件上触发此回调,但我不相信仅仅改变它会将任何东西推送给客户端。

我在应用程序的客户端尝试了一个简单的 http-meta 标签进行刷新,但我在刷新时收到错误提示 cannot GET /login

所以我认为我的设计在这里可能是不正确的。寻找有关如何处理或设计此问题的提示 and/or 建议,以便客户端在从事件处理程序接收到事件时获得更新信息。这样做的唯一方法是使用 AJAX 还是 websockets?

谢谢

Web 套接字允许您将新事件推送到客户端。使用 AJAX 您将不得不重复轮询服务器,就像使用 http-meta 标记一样。您得到的错误是因为您的第一个请求是 POST,而刷新请求是 GET 请求并且您的服务器仅支持 POST(当然可以修复)。

顺便说一句,如果您不介意不完整的 HTML 页面,您可以使用不同的方法,利用浏览器显示 HTML 页面这一事实,即使响应尚未完成。 (浏览器会在一段时间后报告“超时”,但如果已经有要显示的内容,则可能不会。)

下面的代码说明了这个想法。每一秒,都有一个增加计数器的事件。这作为 HTML p 元素写入客户端。在此示例中,它们一个接一个地出现,但使用 CSS 您可以更改它,以便它们看起来像“更新”页面。

app.use(function(req, res) {
  var count = 0;
  res.write("<!DOCTYPE html><html><body>");
  setInterval(function() {
    res.write(`<p>${++count}</p>`);
  }, 1000);
});

“进度指示器”可以用这种方式实现。