【问题标题】:Websockets with Node JS, Express, Heroku: Adding routes breaks web socket connection带有 Node JS、Express、Heroku 的 Websocket:添加路由会中断 Web 套接字连接
【发布时间】:2018-10-19 00:38:24
【问题描述】:

第一次发帖!

我是一个 jode js 新手,在学习 Heroku 教程时寻求帮助:https://devcenter.heroku.com/articles/node-websockets(选项 1)

我正在创建一个应用程序,它将使用带有 node.js、Heroku 和 express 的 web 套接字。当我直接运行上面示例中的 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);

当前索引.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**

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

【问题讨论】:

    标签: node.js express heroku


    【解决方案1】:

    您正在创建express 的两个实例:appserver。您将第一个用于路由器并将其设置为侦听,第二个用于 websockets。您没有设置第二个来监听任何内容,因此无法建立 websocket 连接。我假设您打算使用server 进行所有操作,因此请删除app 并将路由器等连接到server

    【讨论】:

      【解决方案2】:

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

      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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-07-17
        • 2019-02-14
        • 1970-01-01
        • 2020-11-03
        • 1970-01-01
        • 2018-01-21
        • 2013-08-22
        相关资源
        最近更新 更多