Comment configurer route pour websocket server dans express?
j'ai une configuration similaire à celui-ci:
var WebSocketServer = require("ws").Server,
express = require("express"),
http = require("http"),
app = express(),
server = http.createServer(app);
app.post("/login", login);
app.get("/...", callSomething);
// ...
server.listen(8000);
var wss = new WebSocketServer({server: server});
wss.on("connection", function(ws){
// ...
});
j'aimerais placer le serveur web sous un chemin spécifique qui pourrait par exemple être "...com/whatever"
. La question Est: Comment puis-je tracer le chemin? Est-il possible?
3 réponses
vous voudrez utiliser le path
option:
var wss = new WebSocketServer({server: server, path: "/hereIsWS"});
ici
utiliser express-ws: https://www.npmjs.com/package/express-ws
Installation:
npm i express-ws -S
exemple de serveur HTTP:
const express = require('express')
const enableWs = require('express-ws')
const app = express()
enableWs(app)
app.ws('/echo', (ws, req) => {
ws.on('message', msg => {
ws.send(msg)
})
ws.on('close', () => {
console.log('WebSocket was closed')
})
})
app.listen(80)
HTTPS server exemple:
NOTICE je recommande fortement de faire des fonctionnalités telles que HTTPS, compression et cache à l'aide d'un serveur intermédiaire entre NodeJS et Internet, par exemple Nginx, il fonctionne beaucoup plus efficacement et son la configuration sera plus facile à changer à l'avenir
const https = require('https')
const fs = require('fs')
const express = require('express')
const expressWs = require('express-ws')
const serverOptions = {
key: fs.readFileSync('key.pem'),
cert: fs.readFileSync('cert.pem')
}
const app = express()
const server = https.createServer(serverOptions, app)
expressWs(app, server)
app.ws('/echo', (ws, req) => {
ws.on('message', msg => {
ws.send(msg)
})
ws.on('close', () => {
console.log('WebSocket was closed')
})
})
server.listen(443)
Navigateur client exemple:
// wss: protocol is equivalent of https:
// ws: protocol is equivalent of http:
// You ALWAYS need to provide absolute address
// I mean, you can't just use relative path like /echo
const socketProtocol = (window.location.protocol === 'https:' ? 'wss:' : 'ws:')
const echoSocketUrl = socketProtocol + '//' + window.location.hostname + '/echo/'
const socket = new WebSocket(echoSocketUrl);
socket.onopen = () => {
socket.send('Here\'s some text that the server is urgently awaiting!');
}
socket.onmessage = e => {
console.log('Message from server:', event.data)
}
accepté La réponse n'est plus valide et jeter Frame Header Invalid
erreurs. Pull Request #885.
le problème ici est que chaque serveur web ajoute un nouvel écouteur pour l'événement de mise à niveau sur le serveur HTTP et quand cet événement est émis, handleUpgrade est appelé sur tous les serveurs.
Voici le travail autour de:
const wss1 = new WebSocket.Server({ noServer: true });
const wss2 = new WebSocket.Server({ noServer: true });
const server = http.createServer();
server.on('upgrade', (request, socket, head) => {
const pathname = url.parse(request.url).pathname;
if (pathname === '/foo') {
wss1.handleUpgrade(request, socket, head, (ws) => {
wss1.emit('connection', ws);
});
} else if (pathname === '/bar') {
wss2.handleUpgrade(request, socket, head, (ws) => {
wss2.emit('connection', ws);
});
} else {
socket.destroy();
}
});