【问题标题】:Serve different instance of static page on same port in node js在节点 js 的同一端口上提供不同的静态页面实例
【发布时间】:2021-07-20 22:45:00
【问题描述】:

我在端口 3000 上运行 node.js 服务器。

在这个端口上它返回“index.html”页面,这个页面里面有iframe。

根据某些情况,我们正在将 iframe 的源代码更改为各种静态 html 页面。

下面是高级代码和图表

现在,当只有单个应用程序使用 http://ip_address:3000 上的套接字连接到 node.js 服务器时,这很有效

为简单起见,请考虑以下内容: App#1 发出一个事件

socket.emit

在服务器接收到事件后,服务器将向页面(web)index.html 发送事件,然后将 index.html 中的源页面设置为不同的静态 html 页面。

这里的问题是当 app#2 或 app#3 连接到 node.js 服务器时,它会提供与 app#1 显示的相同页面内容。

我们想要实现的是:当 App#1 连接到 index.html 的服务器状态时,不应该在连接时显示给 app#2。 App#2 应该看到在 index.html 中分配的初始默认页面,即 index.html 的新实例。

我是node.js的新手,谁能分享解决这个问题的想法和基本架构缺陷?

感谢您耐心阅读到这里!

【问题讨论】:

    标签: javascript html node.js express socket.io


    【解决方案1】:

    您似乎想为访问者提供不同版本的index.html,具体取决于访问者来自的应用程序。

    在这种情况下,您无法使用 res.sendFile(filename) 从文件中提供它。换句话说,/index.html 不再是静态对象,而是必须专门为每个访问者呈现的对象。 Express 就是为此而生的:你可以使用

    async function renderRootPage (req, res, next) {
       /* code to figure out what to put into the returned page */
       const iframePage = 'whatever.html'
       res.render( {iframePage} ).end()
    }
    app.get('/index.html', renderRootPage)
    app.get('/', renderRootPage)
    

    相反,您必须使用模板为相关网站访问者生成适当版本的index.html。你没有告诉我们你使用的是哪个express template engine,所以很难给你更具体的建议。

    【讨论】:

    • 其实我们并没有使用什么express模板引擎,逻辑是用index.html的js里面的java脚本写的。谢谢你的回复。
    【解决方案2】:

    默认情况下,当您启动套接字并加入连接时,每个人都将连接到“/”命名空间。一旦你在没有指定命名空间或房间的情况下发出任何东西,它就会向连接到“/”命名空间的每个人发送。这就是每个人都在同一页面上的原因。我能想到的方法有两种。首先是每个用户都有一个单独的房间。第二个是跟踪套接字ID,而不是使用“socket.to(socketId)”。你可以参考这个https://socket.io/docs/v3/server-api/#socket-rooms链接来检查socket.to和房间是如何工作的。他们有很好的例子。

    【讨论】:

    • 谢谢您的建议。如果我使用房间,那么将创建新的网页实例?
    • 当前发出将相同的文件发送给连接到您后端的每个人。通过将用户分配到房间,您可以选择将特定消息发送到该房间中的所有用户都会收到的房间。因此,如果每个房间只有一个用户,那么只有一个用户会收到消息。
    猜你喜欢
    • 2017-05-24
    • 2017-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多