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?

19
demandé sur HPierce 2014-03-16 01:08:26

3 réponses

vous voudrez utiliser le path option:

var wss = new WebSocketServer({server: server, path: "/hereIsWS"});
ici

30
répondu Aaron Dufour 2015-03-12 16:35:49

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)
}
16
répondu Ujeenator 2018-09-06 13:29:33

accepté La réponse n'est plus valide et jeter Frame Header Invalid erreurs. Pull Request #885.

Lpinca met:

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();
  }
});
11
répondu Quesofat 2017-06-23 13:46:04