socket.io在cpanel上运行应用程序管理器时出现错误



嗨,

在苦苦挣扎之后,我终于能够通过cpanel应用程序管理器在共享主机上运行socket.io。事实证明,在注册应用程序时,无论您计划从哪个文件夹访问应用程序,都必须将"基本应用程序URL"字段留空。

假设我的域是example.com,我想把我的聊天安装在一个名为myapp的文件夹上,这样你就可以从这里访问它:example.com/myapp

在注册应用程序时,你会遇到一个文件,上面写着:

基本应用程序URL:输入应用程序的基本URL。在你之后注册应用程序,您可以使用此URL访问它。

常识告诉你输入";myapp",正确的好吧,忽略这一点,因为如果你只输入一个/你的socket.io应用程序,就无法工作。为了能够从你想要的文件夹访问它,你必须在app.js文件中声明它,如下所示:

app.get('/myapp', (req, res) => {  

那么你的应用程序就可以工作了。然而,请注意,您的整个域现在将位于node.js服务器下,而不仅仅是您访问应用程序的文件夹,我认为这是不对的。

这是cpanel错误还是socket.io错误?或者我错过了什么。

谢谢。

好吧,让它在我这边工作,这是我的环境:

在cpanel中,在应用程序注册菜单中:

应用程序URL:您希望从中访问应用程序的实际目录,因此您确实可以将其从"更改为""至";myapp";

实际需要的文件:

  • public_html/.htaccess

    # DO NOT REMOVE. CLOUDLINUX PASSENGER CONFIGURATION BEGIN
    PassengerAppRoot "<root>/myapp"
    PassengerBaseURI "/myapp"
    PassengerNodejs "<root>/nodevenv/myapp/10/bin/node"
    PassengerAppType node
    PassengerStartupFile app.js
    # DO NOT REMOVE. CLOUDLINUX PASSENGER CONFIGURATION END
    # DO NOT REMOVE OR MODIFY. CLOUDLINUX ENV VARS CONFIGURATION BEGIN
    <IfModule Litespeed>
    </IfModule>
    # DO NOT REMOVE OR MODIFY. CLOUDLINUX ENV VARS CONFIGURATION END
    

(注意:<root>是我的网络主机上"public_html"的路径)

  • public_html/myapp/index.html(这是服务器要提供给客户端的文件,请参阅下面的服务器文件)

    <!doctype html>
    <html>
    <head>
    <title>Socket.IO chat</title>
    <style>
    * { margin: 0; padding: 0; box-sizing: border-box; }
    body { font: 13px Helvetica, Arial; }
    #chat { background: #000; padding: 3px; position: fixed; bottom: 0; width: 100%; }
    #chat input { border: 0; padding: 10px; width: 90%; margin-right: 0.5%; }
    #chat button { width: 9%; background: rgb(130, 224, 255); border: none; padding: 10px; }
    #messages { list-style-type: none; margin: 0; padding: 0; }
    #messages li { padding: 5px 10px; }
    #messages li:nth-child(odd) { background: #eee; }
    </style>
    </head>
    <body>
    <h1>Socket.IO Chat Test</h1>
    <ul id="messages"></ul>
    <div id='chat'>
    <input id="m" autocomplete="off" /><button id='submit'>Send</button>
    </div>
    <script src="/socket.io/socket.io.js"></script>
    <script>
    var submit = document.getElementById('submit');
    var m = document.getElementById('m');
    var socket = io();
    submit.onclick = function(e){
    socket.emit('data', {message: m.value});
    m.value = '';
    return false;
    };
    socket.on('data', function(msg){
    console.log(msg);
    if(msg.message){
    var e = document.createElement('li');
    e.innerHTML = msg.message;
    document.getElementById('messages').appendChild(e);
    }
    });
    </script>
    </body>
    </html>
    

(注意:确保您有这个/socket.io/socket.io.js路径。您不需要在index.html旁边有一个socket.io文件夹,该文件夹将作为socket.io依赖项的一部分获取)

最后,您的服务器文件,应该在";myapp";在您的<根>目录:

  • <根>myapp/app.js
    const port = 3000;
    var app = require('express')();
    var http = require('http').createServer(app);
    var io = require('socket.io')(http);
    app.get('/', (req, res) => {
    res.sendFile(__dirname + '/index.html');
    });
    io.on('connection', (socket) => {
    socket.on('data', (msg) => {
    console.log(msg);
    io.emit('data', msg);
    });
    });
    http.listen(port, () => {
    console.log('listening on *:' + port);
    });
    

(注意:这里的重要部分是我为应用程序留下了"/"。get函数)

如果您需要更多信息,请告诉我!