Express 和 WebSocket 在同一端口上侦听
Express and WebSocket listening on the same port
我有一个应用程序.js用于在收到某些 POST 数据时触发两个事件:
- 将开机自检数据插入数据库
- 使用 WebSocket 向客户端发送消息
这是应用程序.js(仅重要行)
var express = require('express');
var bodyParser = require('body-parser');
var server = require('./server');
var app = express();
var port = process.env.PORT || 3000;
app.post('/server', server);
app.listen(port, function(){
console.log('Slack bot listening');
});
这是服务器.js(只有重要的行)
var db = require('./DB');
var WebSocketServer = require('ws').Server;
var insertData = function(req, res){
var wss = new WebSocketServer({server: server});
console.log('WebSocketServer created');
wss.on('connection', function(wss){
wss.send(JSON.stringify('Socket open'));
});
wss.on('close', function(){
console.log('WebServerSocket has been closed');
});
};
module.exports = insertData;
我想实现的是将WebSocketServer设置为侦听应用程序的相同端口。我想过将服务器 var 从 app.js 传递到服务器.js但是
- 我认为这不是一种优雅的方式
- 我不知道该怎么做
你们怎么看?
根据您的代码和注释,这里有一个非常简单的示例,说明它如何协同工作。
首先,http-server.js
- 一个典型的快速应用程序,除了我们不以app.listen()
启动服务器:
'use strict';
let fs = require('fs');
let express = require('express');
let app = express();
let bodyParser = require('body-parser');
app.use(bodyParser.json());
// Let's create the regular HTTP request and response
app.get('/', function(req, res) {
console.log('Get index');
fs.createReadStream('./index.html')
.pipe(res);
});
app.post('/', function(req, res) {
let message = req.body.message;
console.log('Regular POST message: ', message);
return res.json({
answer: 42
});
});
module.exports = app;
现在,ws-server.js
示例,我们从节点本机创建 WSS 服务器 http.createServer()
.现在,请注意,这是我们导入应用程序的地方,并为此本机 http.createServer 提供要使用的应用程序实例。
使用PORT=8080 node ws-server.js
启动应用程序:
请注意,您正在启动第二个与套接字相关的文件(ws-server),而不是第一个与http相关的文件(http-server)。
'use strict';
let WSServer = require('ws').Server;
let server = require('http').createServer();
let app = require('./http-server');
// Create web socket server on top of a regular http server
let wss = new WSServer({
server: server
});
// Also mount the app here
server.on('request', app);
wss.on('connection', function connection(ws) {
ws.on('message', function incoming(message) {
console.log(`received: ${message}`);
ws.send(JSON.stringify({
answer: 42
}));
});
});
server.listen(process.env.PORT, function() {
console.log(`http/ws server listening on ${process.env.PORT}`);
});
最后,此示例index.html
将通过创建 POST 和套接字"请求"来工作,并显示响应:
<html>
<head>
<title>WS example</title>
</head>
<body>
<h2>Socket message response: </h2>
<pre id="response"></pre>
<hr/>
<h2>POST message response: </h2>
<pre id="post-response"></pre>
<script>
// Extremely simplified here, no error handling or anything
document.body.onload = function() {
'use strict';
// First the socket requesta
function socketExample() {
console.log('Creating socket');
let socket = new WebSocket('ws://localhost:8080/');
socket.onopen = function() {
console.log('Socket open.');
socket.send(JSON.stringify({message: 'What is the meaning of life, the universe and everything?'}));
console.log('Message sent.')
};
socket.onmessage = function(message) {
console.log('Socket server message', message);
let data = JSON.parse(message.data);
document.getElementById('response').innerHTML = JSON.stringify(data, null, 2);
};
}
// Now the simple POST demo
function postExample() {
console.log('Creating regular POST message');
fetch('/', {
method: 'post',
headers: {
"Content-type": "application/json"
},
body: JSON.stringify({message: 'What is the meaning of post-life, the universe and everything?'})
})
.then(response => response.json())
.then(function (data) {
console.log('POST response:', data);
document.getElementById('post-response').innerHTML = JSON.stringify(data, null, 2);
})
.catch(function (error) {
console.log('Request failed', error);
});
}
// Call them both;
socketExample();
postExample();
}
</script>
</body>
</html>
请注意,您需要一个更新的浏览器,该浏览器同时具有WebSocket和Fetch API的客户端部分,但无论如何它都无关紧要,它只是为您提供了要点。
http 和 ws 在同一个端口 80 上,"惊人的 Zlatko 方法™"。
你会有一个文件,比如main.js,带有
var app = express()
和许多行快速代码。
以通常的方式拥有尽可能多的中间件是完全可以的,无需更改。
var app = express()
app.use(session(session_options))
app.use(passport.initialize())
app.use(passport.session())
app.use('/static', express.static('static'))
// etc etc
app.get ...
app.get ...
app.post ...
app.post ...
通常在该文件的末尾,您会
app.listen(80, (err) => { ... })
删除它。
//app.listen(80, (err) => { ... })
快速应用文件中没有其他更改。
在你的websocket文件中,比如多人游戏.js,你通常会有
const WebSocket = require('ws');
const wss = new WebSocket.Server({
port: 9999,
perMessageDeflate: false
})
事实上,更改为
const WebSocket = require('ws');
/*const wss = new WebSocket.Server({
port: 2828,
perMessageDeflate: false
});*/
let WSServer = WebSocket.Server;
let server = require('http').createServer();
let app = require('./main'); // note, that's your main.js file above
let wss = new WSServer({
server: server,
perMessageDeflate: false
})
server.on('request', app);
TBC,请注意,令我惊讶的是,WebSocket.Server 确实自然而然地想要监听 80。
在该文件的末尾
server.listen(80, function() {
console.log(`Amazing Zlatko Method™ combo server on 80`);
});
注意!- 启动"多人游戏.js"文件(不是"主要.js")。
它工作得很好。神奇的东西。
以上所有答案都很好...请找到下面的示例代码,似乎更简单一些
var express = require('express')
var app = express()
var http = require('http').createServer(app);
var io = require('socket.io')(http);
app.get('/', function (req, res) {
res.sendFile(__dirname + '/index.html');
});
http.listen(process.env.PORT || 3000, function() {
var host = http.address().address
var port = http.address().port
console.log('App listening at http://%s:%s', host, port)
});
io.on('connection', function(socket) {
console.log('Client connected to the WebSocket');
socket.on('disconnect', () => {
console.log('Client disconnected');
});
socket.on('chat message', function(msg) {
console.log("Received a chat message");
io.emit('chat message', msg);
});
})
- 使用Express捕获参数
- 从模块内部访问Express装载路径
- chrome在WebSocket握手期间获取新错误
- ReactJS和SpringDataRest缓存问题可能与websocket有关
- 在Nodejs中Express输入DEBUG=app时权限被拒绝/bin
- 如何使用Node/Express显示有关特定错误的自定义html页面
- 发送json对象或使用express路由呈现视图
- renderReact/Rect Router+Node/Express.js的服务器端/同构渲染中未定义renderP
- Node.js上的WebSocket,并在所有连接的客户端之间共享消息
- 为什么不't Express呈现我的React应用程序
- Tomcat websocket is not working
- Express服务器中语言子域的最佳实践
- 为什么不是'我的函数在解析云代码中工作吗?当我在Angular和Express中测试时,它是有效的
- Nodejs和express路由,如何处理客户端的承诺
- 具有http服务器、websocket和express的体系结构
- websocket可以使用http模块,但不能使用express(node.js)
- Express 和 WebSocket 在同一端口上侦听
- 不能通过express-ws中间件正确创建websocket服务器
- Express, ws, websocket, express-ws
- 存在哪些Express websocket事件