第一次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**
我确信这是一个简单的错误,但我找不到它-感谢任何人的帮助!
答案 0 :(得分:0)
您正在创建express
的两个实例:app
和server
。您将第一个用于路由器并将其设置为侦听,第二个用于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);