node.js - 带有 Express 的 WebSocket - 无效的 WebSocket 帧:无效的 UTF-8 序列
问题描述
我正在使用HTTPS
、Express
、Socket.io
和构建一个 Web 应用程序WebSocket
。目前Express
正在使用3000端口。为了使用与WebSocket
3000端口相同的端口,我编写了如下代码。
应用程序.js
const path = require('path');
const express = require('express');
const app = express();
const mainRouter = require('./routes/main/main');
// Middleware
...
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.use(express.static(path.join(__dirname, 'public')));
app.use(express.static(path.join(__dirname, 'res')));
app.use('/', mainRouter);
// 404 error handler
app.use((req, res) => {
logger.error(`404 Page not found`);
res.status(404).send('404 Page not found');
});
module.exports = app;
斌/万维网
const fs = require('fs');
const path = require('path');
const app = require('../app');
const https = require('https');
const options = {
key: fs.readFileSync(path.resolve(__dirname, '../config/ssl/localhost-key.pem')), // Private key
cert: fs.readFileSync(path.resolve(__dirname, '../config/ssl/localhost.pem')), // Certificate
};
const server = https.createServer(options, app);
const io = require('socket.io')(server);
const WebSocket = require('../public/js/websocket');
const normalizePort = (value) => {
const port = parseInt(value, 10);
if(isNaN(port)) {
return value;
}
if(port >= 0) {
return port;
}
return false;
};
const port = normalizePort(process.env.PORT || 3000);
// Setting port
app.set('port', port);
const onError = (err) => {
if(err.syscall !== 'listen') {
throw err;
}
const bind = typeof(port) === 'string' ? `Pipe ${port}` : `Port ${port}`;
switch(err.code) {
case 'EACCES':
console.error(`${bind} requires elevated privileges`);
process.exit(1);
break;
case 'EADDRINUSE':
console.error(`${bind} is already in use`);
process.exit(1);
break;
default:
throw error;
}
};
const onListening = () => {
const address = server.address();
const bind = typeof(address) === 'string' ? `Pipe ${address}` : `Port ${port}`;
};
...
WebSocket(server);
server.listen(port, '0.0.0.0');
server.on('error', onError);
server.on('listening', onListening);
公共/js/websocket.js
const ws = require('ws');
module.exports = function WebSocket(server) {
const wss = new ws.Server({ server : server });
wss.on('connection', (ws, req) => {
ws.on('message', (data) => {
ws.send(data);
console.log(data);
});
});
wss.on('listening', () => {
console.log('listening..');
});
};
路线/main/main.js
const router = require('express').Router();
const { v4 : uuidv4 } = require('uuid');
router.get('/', (req, res) => {
res.redirect(`/${uuidv4()}`);
});
router.get('/:room', (req, res) => {
res.render('main/main', { room: req.params.room });
});
module.exports = router;
如上配置服务器后,如果连接到https://localhost:3000
after npm start
,会出现如下错误。
错误:无效的 WebSocket 帧:无效的 UTF-8 序列...代码:'WS_ERR_INVALID_UTF8',[符号(状态代码)]:1007
我不明白为什么会发生此错误。另外,如何修复代码以修复错误?
解决方案
推荐阅读
- google-apps-script - 将 Apps Script HTML 中的客户端`JavaScript fetch().then()` 转换为 google.script.run
- cmake - cmake install DESTINATION 在 Linux 上不起作用
- javascript - 如何在括号中嵌入 HTML 的 JS 中显示语法错误?
- python - Python。如何在 FOR 循环之前或之中处理标准
- javascript - 使用 nodejs 应用程序中的 Sequelize 模型卡在使用计数生成正确的左连接查询
- python-3.x - 解析文本并提取数据
- c++ - 如何在允许运行时调用的同时保证算法的编译时评估
- react-native - 如何在滚动视图中实现scrollToEnd函数反应原生
- java - 如何在 Java 11 中使用不受支持的语言环境和 String.format() 中的数字
- utf-8 - MacOS Big Sur:意外的差异行为