【问题标题】:Socket.io works on localhost but not on heroku deploymentSocket.io 适用于 localhost 但不适用于 heroku 部署
【发布时间】:2018-10-10 01:37:24
【问题描述】:

它成功部署并发布了一个成功的构建,但 socket.io 模块由于某种原因无法工作。我已经尝试了在这个论坛上发布的各种解决方案,但似乎没有一个对我有用。奇怪的是,它在 localhost 上运行良好,但在 heroku 上却不行,所以我不确定发生了什么。这是我的代码:

服务器端:

var express = require('express');
var socket = require('socket.io');

var app = express();
const PORT = process.env.PORT || 8080;


const server = app.listen(PORT, "0.0.0.0", function(){
    console.log('server is running on port: ' + PORT);
});

io = socket(server);

io.on('connection', (socket) => {
    console.log(socket.id);

    socket.on('SEND_MESSAGE', function(data){
        io.emit('RECEIVE_MESSAGE', data);
    })
});

客户端:

import React from "react";
import io from "socket.io-client";

class Chat extends React.Component{
    constructor(props){
        super(props);

        this.state = {
            username: '',
            message: '',
            messages: []
        };


        this.socket = io.connect('localhost:8080');

        this.socket.on('RECEIVE_MESSAGE', function(data){
            addMessage(data);
        });

        const addMessage = data => {
            console.log(data);
            this.setState({messages: [...this.state.messages, data]});
            console.log(this.state.messages);
        };

        this.sendMessage = ev => {
            ev.preventDefault();
            this.socket.emit('SEND_MESSAGE', {
                author: this.state.username,
                message: this.state.message
            })
            this.setState({message: ''});

        }
    }
    render(){
        return (
            <div className="container" style={{width: '100%', height: '100%'}}>

                <div className="card" >
                    <div className="card-body">
                        <div className="card-title">Global Chat</div>
                        <hr/>
                        <div className="messages">
                            {this.state.messages.map(message => {
                                return (
                                    <div>{message.author}: {message.message}</div>
                                )
                            })}
                        </div>

                    </div>
                    <div className="card-footer">
                        <input type="text" placeholder="Username" value={this.state.username} onChange={ev => this.setState({username: ev.target.value})} className="form-control"/>
                        <br/>
                        <input type="text" placeholder="Message" className="form-control" value={this.state.message} onChange={ev => this.setState({message: ev.target.value})}/>
                        <br/>
                        <button onClick={this.sendMessage} className="btn btn-primary form-control">Send</button>
                    </div>
                </div>

            </div>
        );
    }
}

export default Chat;

我知道 url 不应该是 'localhost:8080' 并且我尝试了其他选项,例如将 url 作为 heroku url 输入,例如 'my-app.herokuapp.com' 但它总是给出一些错误,我不确定,我在这个论坛上看到的所有解决方案都不起作用。任何帮助,将不胜感激!提前致谢!

【问题讨论】:

  • 你添加端口了吗? my-app.herokuapp.com:8080
  • 是的,还是不行。当我这样做时,它不会在控制台中给我一个错误,但 socket.io 由于某种原因仍然无法工作。就好像服务器和客户端之间没有通信一样。
  • 你能试试这个吗 :const server = http.createServer(app).listen(config.port) ;你也可以改变 var socket = require('socket.io') 和 io = socket(server);只需 const io = require('socket.io')(server, { 你想要的参数 });因为对于两个不同的事物有两倍的套接字声明是很奇怪的
  • 还是不行。控制台中也没有任何错误。

标签: reactjs sockets heroku websocket socket.io


【解决方案1】:

抱歉,上面的评论不太可读。你可以试试这个:

服务器端

    const http = require('http');
    const express = require('express');
    const io = require('socket.io');
    const app = express();
    const port = process.env.PORT || 8080; 
    const server = http.createServer(app).listen(port);
    io = require('socket.io')(server,{parameters});

客户端:

 this.socket = io.connect(); //remove local host

【讨论】:

  • 1.你不需要 express 并且你在定义服务器之前放置了 io 但这没关系,因为我修复了这些。这样做,它甚至在本地主机中都不起作用。我在控制台中遇到了两个错误: 1. 加载资源失败:localhost:3000/socket.io/… 服务器响应状态为 404(未找到) 2. polling-xhr.js:263 POST localhost:3000/socket.io/… 404(未找到)跨度>
  • oups 抱歉,匆忙写会更正,你的问题解决了吗?
  • 事实上你应该在你的客户端在另一行下面有这样的东西 this.socket = io(if(myenv === 'development') then 'localhost:8080' else '', {参数});
  • 好的,所以我不了解参数的全部内容。我没有任何服务器参数。但是我该怎么做你说的呢?我会这样做: this.socket = io(if(myenv === 'development') then 'localhost:8080' else '', {parameters});
  • 您需要从客户端告诉套接字您希望它基本上连接到哪里。您在第一篇文章中是对的,在本地主机上连接就足够了。如果你想让他连接到heroku,你需要这样做。socket = io.connect(''); // 参数是你可以给套接字的选项,你可以稍后看到。
猜你喜欢
  • 2016-04-02
  • 2016-10-10
  • 2014-02-26
  • 1970-01-01
  • 2022-09-30
  • 2022-12-10
  • 2018-12-18
  • 2021-04-28
相关资源
最近更新 更多