使用 express 初始化 ws 服务器

Initializing ws server with express

我一直在努力寻找以下代码中的错误来源:

const express = require("express");
const path = require("path");
const WebSocket = require("ws");
const SocketServer = WebSocket.Server;

const PORT = process.env.PORT || 3000; // port to listen on

const INDEX = path.join(__dirname, "index.html"); // index address

var server = express();

server.use((req, res) => res.sendFile(INDEX));
server.listen(PORT, () => console.log(`Listening on port ${ PORT }`));

const wss = new SocketServer({server}); // wss = web socket server

(我有下面的连接等代码,我认为与这个问题无关)

在 运行 之后,我在浏览器中收到来自客户端的以下错误:

与 'ws://localhost:3000/' 的 WebSocket 连接失败:连接在收到握手响应之前关闭

令我困惑的是,如果我进行以下更改,代码仍然有效:

var server = express()
    .use((req, res) => res.sendFile(INDEX));
    .listen(PORT, () => console.log(`Listening on port ${ PORT }`));

此方法的问题是在现有 .use 之前添加另一个 .use 不起作用,这是访问静态文件所必需的(即 javascript 作为其自己的文件而不是在HTML 文件)

为什么在这两个示例之间更改我的代码会破坏它?我该怎么做才能解决这个问题?

谢谢

您需要将 http.createServer 实例传递给 WebsocketServer。不是 express 实例

var app = express();
var server = http.createServer(app);

我找到了解决办法!

原来调用.use和.listen时必须设置server变量的值。

var server = express();

server = server.use((req, res) => res.sendFile(INDEX));
server = server.listen(PORT, () => console.log(`Listening on port ${ PORT }`));

而不是

var server = express();
server.use((req, res) => res.sendFile(INDEX));
server.listen(PORT, () => console.log(`Listening on port ${ PORT }`));