Express和WebSocket在同一端口上侦听

我有一个app.js这是用来触发两个事件时收到一些POST数据:

  1. 将POST数据插入到数据库中
  2. 使用WebSocket向客户端发送消息

这里是app.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'); }); 

这里是server.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传递给server.js,但是

  1. 我认为这不是一个优雅的方式来做到这一点
  2. 我不知道该怎么做

你们有什么感想?

根据你的代码和评论,这是一个超级简单的例子,它将如何协同工作。

首先, 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示例,我们从节点本地http.createServer()创buildWSS服务器。 现在请注意,这是我们导入应用程序的地方,并给这个本机http.createServer使用应用程序实例。

PORT=8080 node ws-server.js启动应用程序PORT=8080 node ws-server.js

 '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将通过创buildPOST和套接字“请求”来显示响应:

 <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和这个客户端部分的API提取,但无论如何,它只是给你的要点。