使用Node JS,Express,Heroku的Websocket:添加路由会中断Web套接字连接

时间:2018-10-18 14:29:50

标签: node.js express heroku

第一次SO发布!

我是一名Jode JS新手,在我关注此处的Heroku教程时正在寻求帮助:https://devcenter.heroku.com/articles/node-websockets(选项1)

我正在创建一个将Web套接字与node.js,Heroku和Express一起使用的应用程序。当我直接按照上面的示例运行server.js代码时,它可以工作。现在,我正在尝试添加路由,由于某种原因,它中断了Web套接字连接。

server.js:

'use strict';

const express = require('express');
const SocketServer = require('ws').Server;
const path = require('path');

const PORT = process.env.PORT || 3000;
const INDEX = path.join(__dirname, 'index.html');

const server = express()

const ADMIN= path.join(__dirname, +'/admin/' + 'adminPage.html');

const wss = new SocketServer({ server });


  var router = express.Router();

 var app=express();
    // home page route
    router.get('/', function(req, res) {
        res.sendFile(INDEX);
    });
    // admin page route
    router.get('/admin', function(req, res) {
        res.sendFile(ADMIN);
    });
    // apply the routes to our application
    app.use(express.static('public'))
    app.use('/', router);

    app.listen(PORT, () => console.log(`Listening on ${ PORT }`));

    wss.on('connection', (ws) => {
      console.log('Client connected');
      ws.on('close', () => console.log('Client disconnected'));
    });

setInterval(() => {
    wss.clients.forEach((client) => {
      client.send(new Date().toTimeString());
    });
  }, 1000);

当前Index.html:

  <p id='server-time'></p>
    <script>
      var HOST = location.origin.replace(/^http/, 'ws')
      var ws = new WebSocket(HOST);
      var el = document.getElementById('server-time');
      ws.onmessage = function (event) {
        el.innerHTML = 'Server time: ' + event.data;
      };
    </script>

重定向到管理页面有效,但是index.html页面返回以下错误:

**WebSocket connection to 'ws://localhost:3000/' failed: Error during WebSocket handshake: Unexpected response code: 200**

我确信这是一个简单的错误,但我找不到它-感谢任何人的帮助!

2 个答案:

答案 0 :(得分:0)

您正在创建express的两个实例:appserver。您将第一个用于路由器并将其设置为侦听,第二个用于websockets。您没有将秒数设置为收听任何声音,因此无法建立网络套接字连接。我假设您打算将server用于所有操作,因此删除app并将路由器等连接到server

答案 1 :(得分:0)

感谢您对萨米人的帮助!我试图按照您的建议删除应用程序,但仍然无法正常工作。我找到了另一个在线资源,这是最终的工作代码:

const SocketServer = require('ws').Server;
var express = require('express');
var path = require('path');
//init Express
var app = express();
//init Express Router
var router = express.Router();
var port = process.env.PORT || 3000;
var admin = path.join(__dirname, '/admin/adminPage.html');

app.get('/', function(req, res) {
    res.sendFile(path.join(__dirname + '/index.html'));
});
app.get('/admin', function(req, res) {
    res.sendFile(admin);
});
var server = app.listen(port, function () {
    //listening
})
const wss = new SocketServer({ server });

wss.on('connection', function connection(ws) {
    console.log("connection ...");
});
setInterval(() => {
    wss.clients.forEach((client) => {
      client.send(new Date().toTimeString());
    });
  }, 1000);