我正在尝试根据来自 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);
});
“进度指示器”可以用这种方式实现。
我正在使用 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);
});
“进度指示器”可以用这种方式实现。