【问题标题】:OpenShift NodeJS deployment : socket.io index.html port assignment, etcOpenShift NodeJS 部署:socket.io index.html 端口分配等
【发布时间】:2014-05-06 21:02:32
【问题描述】:

我使用 socket.io 和 express 模块在本地编写了一个 nodeJS 应用程序。 我想使用 openshift 进行托管。 所以我将主 .js 更改为 server.js,这似乎是 openshift 文件的索引等效项,并将服务器端口设置更改为:

var server = require('http').createServer(app).listen(process.env.OPENSHIFT_NODEJS_PORT || 3000);

如某些帖子中所述。 但是在 git commit 之后,我仍然得到:

远程:信息:socket.io 已启动 远程:警告:引发错误:错误:监听 EACCES 远程:调试:程序节点 server.js 以代码 0 退出 偏僻的: 远程:调试:使用 'node server.js' 启动子进程

网站无法运行。

当应用程序提供一个 html 文件时,还有两个地方提到了端口,它们位于提供服务的 index.html 中:

标题:

<script src='//localhost:3000/socket.io/socket.io.js'></script>

在 html 文件的 javascript 中:

var socket = io.connect('//localhost:'+process.env.OPENSHIFT_NODEJS_PORT || 3000);

// 来自服务器的初始变量和多列表 socket.on('clientConfig', onClientConfig);

所有文件和模块貌似都上传了,但是EACCES错误依然存在。

我觉得可能指向 localhost:3000 的标题链接可能是跳过点,但我不确定。任何人都有任何想法,问题是什么? 另外,socket.io 模块文件夹中没有 :socket.io/socket.io.js 文件,我觉得这很混乱。

【问题讨论】:

    标签: javascript node.js sockets openshift


    【解决方案1】:

    我最近使用 socket.io 开发了一个聊天客户端应用程序,其中还包含 webrtc。通过对代码进行以下更改,我能够在 openshift 上部署应用程序。

    客户端

    像这样以相对的方式保留包含脚本标签

    &lt;script src="/socket.io/socket.io.js"&gt;&lt;/script&gt;

    在声明 io.connection 时,更改 ip 部分以将应用程序指向这种格式的服务器。

    var socket = io.connect('http://yourapp-domain.rhcloud.com:8000/', {'forceNew':true });

    8000 用于 http,8443 用于 https

    服务器端

    io 和服务器应该都在同一个端口上侦听,并且还应该注意语句的运行顺序。

    第 1 步:使用 app 声明 http 服务器。 (app是从express获取的)

    var express = require('express');var app = express();) var server = require('http').Server(app);

    第 2 步:

    从 socket.io 声明 io 并将其与服务器对象结合。 var io = require('socket.io').listen(server);

    第 3 步:

    现在,让服务器监听 openshift 端口和 ip。

    server.listen(process.env.OPENSHIFT_NODEJS_PORT, process.env.OPENSHIFT_NODEJS_IP);

    请特别注意你写的语句的顺序,这是导致问题的顺序。

    【讨论】:

    • 这正是我的问题。我花了 5 多个小时试图找出我做错了什么,阅读了大量文章,这些文章都朝着相似的方向发展,但没有像你那样清楚地拼写出来。我没有意识到服务器实际上并没有在监听,因为我相信 socket.io 已经在这样做了!
    【解决方案2】:

    我在这里有一些关于如何使用 WebSockets 的注意事项:https://www.openshift.com/blogs/10-reasons-openshift-is-the-best-place-to-host-your-nodejs-app#websockets

    您不需要任何额外的服务器端更改after adapting your code to take advantage of environment variables (when available)

    OpenShift 的路由层在几个外部可访问的端口上公开您的应用程序:80、443、8000、8443。

    端口 8000 和 8443 都能够处理 websocket 连接升级。我们希望尽快添加对通过端口 80 和 443 的 WebSocket 连接的支持。

    【讨论】:

    • 好吧,这让我很困惑,我仍在尝试测试第一个答案。
    • 如果你看上面我没有使用服务器端的特定 IP 来启动服务器。有问题吗?
    • 是的。此外,“process.env”仅适用于您的服务器端代码。如果您想从客户端 javascript 访问该信息,则需要建立另一种方式来引用它。
    • 我想了很多,让主代码运行,但我认为 index.html 中对其他脚本的相对 .js 引用被破坏了。这在我的本地服务器上运行良好,为什么在 openshift 中中断?太多的不同......
    • 我为 server.js 和 process.env 添加了 8080。在客户端(index.html 和 socket.js,我添加了 ws://xxx:8000 域位置。
    【解决方案3】:

    你的 websocket 的服务器端需要监听你的 openshift ip 地址的 8080 端口,客户端需要连接到你的 ws://app-domain.rhcloud.com:8000

    【讨论】:

    • 所以在 server.js 中它需要是 8080 而在 html 中对于 socket.io 来说都是 ws://app-domain.rhcloud.com:8000,是吗?
    • 正确。也可以使用 wss://app-domain.rhcloud.com:8443 来使用 ssl
    • 好的,我把 server.js 改成了:
    • var server = require('http').createServer(app).listen(process.env.OPENSHIFT_NODEJS_PORT || 8080);
    • index.html:
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-08
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    相关资源
    最近更新 更多