Heroku搞砸了我的Socket.Io / NodeJS应用程序

时间:2018-01-20 01:13:42

标签: node.js heroku

我正在尝试部署网站但是当我尝试登录时,我总是会得到“无效的点”'我创造了。在我的计算机上运行它时,应用程序非常完美。在我实现socket.io之前它曾经完美地工作,所以我可能会在我的前端弄乱一些东西。

这是我的 app.js 代码:

const express = require('express');
const app = express();
const path = require('path');
const bodyParser = require('body-parser');
const cors = require('cors');
const passport = require('passport');
const AWS = require('aws-sdk');
var dynamoose = require('dynamoose');
var awsIot = require('aws-iot-device-sdk');
const client = require('socket.io').listen(8080).sockets;


dynamoose.AWS.config.update({
PRIVATE INFO
});    

const users = require('./routes/users');
const info = require('./routes/info');


app.use(cors({credentials: true, origin: 'http://localhost:4200'}));

// Static folder
app.use(express.static(path.join(__dirname, 'public')));

// Body parser middleware
app.use(bodyParser.json());


app.use(passport.initialize());
app.use(passport.session());
require('./config/passport')(passport);

app.use('/users', users);
app.use('/info', info)


app.get('/', (req, res) => {
  res.send("Invalid endpoint");
});


const port = process.env.PORT || 8888;
const host = '0.0.0.0';
app.listen(port, host, () => {
  console.log("Server listening on: " + port)
});


// Device IoT
var device = awsIot.device({
PRIVATE CONFIG, SORRY
  });

device
.on('connect', function() {
    console.log('Works');
    device.subscribe('PRIVATE-BUT-WORKING');
});

client.on('connection', function(socket){
  device.on('message', function(topic, payload) {
      socket.emit('output', payload.toString());
  });
});

这是我在套接字中使用的服务

import { Injectable } from '@angular/core';
import { Subject } from 'rxjs/Subject';
import { Observable } from 'rxjs/Observable';
import * as io from 'socket.io-client';

@Injectable()
export class SocketIOService {
    private url = 'http://localhost:8080';
    private socket;

    getMessages() {
        let observable = new Observable(observer => {
          this.socket = io(this.url);
          this.socket.on('message', (data) => {
            observer.next(data);
          });
          return () => {
            this.socket.disconnect();
          };
        })
        return observable;
      }
}

我尝试了一些我在这里找到但没有任何反应的解决方案

1 个答案:

答案 0 :(得分:0)

你有两个问题。最严重的一个是你尝试通过与快递应用程序不同的端口提供websockets。 Heroku只为web dyno打开一个端口。所以你需要在服务器端做这样的事情(改编自socket.io)docs:

const port = process.env.PORT || 8888;
var app = require('express')();
var server = require('http').Server(app);
var io = require('socket.io')(server);

server.listen(port);

app.get('/', function (req, res) {
  res.sendfile(__dirname + '/index.html');
});

io.on('connection', function (socket) {
  socket.emit('news', { hello: 'world' });
  socket.on('my other event', function (data) {
    console.log(data);
  });
});

从那里你可以编辑你的客户端以击中正确的服务器(这应该在本地和远程工作)。您应该能够构造没有任何参数的套接字客户端(这将告诉它连接到源):

this.socket = io();

您的角色设置可能还有问题。

app.use(cors({credentials: true, origin: 'http://localhost:4200'}));

这个起源是否会发挥作用?但也许你可以解决修复这些其他问题后导致的任何问题。