将 `express()` 和 `ws()` 对象导出到 Node 中的其他文件时出现问题?

Posted

技术标签:

【中文标题】将 `express()` 和 `ws()` 对象导出到 Node 中的其他文件时出现问题?【英文标题】:Issue exporting `express()` and `ws()` objects to other files in Node? 【发布时间】:2018-08-23 21:45:05 【问题描述】:

假设我的应用程序的入口点是app.js 我想在应用程序运行时创建一个套接字连接,然后将其导出到整个应用程序中的其他文件。

这里有一些示例代码

const express = require('express');
const WebSocket = require('ws');
const app = express();
app.use(allTheMiddleWares);
app.listen(PORT, () => 
    console.log('started app');


const socket = new WebSocket.Server(server: app);

module.exports = socket;

然后,当我尝试从app.js 访问导出时,我总是得到一个空对象。

我也尝试过导出函数:

module.exports =  
    test: () => console.log("why don't I work")

但是,这也返回一个空对象。

提前感谢您的帮助。

作为全局访问套接字的临时解决方法,我设置了process.WebSocket = new WebSocket.Server(server: app);。我想知道这是否有任何明显的问题。

【问题讨论】:

附言。上面的代码不是真的。只是一个插图。 你能用export default socket;代替module.exports = socket;吗? 当你在导入时得到一个空对象,通常是因为循环模块依赖,A 导入 B,B 导入 A。你对代码了解不够,我们无法查看这就是问题所在。 另外,new WebSocket.Server(server: app); 看起来不对,因为app 不是服务器(它是一个 Express 请求处理函数)。 app.listen() 返回创建的服务器对象。 如果不查看您要导出的文件和要导入的文件这两个文件,我们将无能为力。 module.exports = socket; 没有任何问题,所以这里肯定有其他事情发生。而且,使用global 是一个坏主意,也是一个不好的开始趋势。以正确的方式解决问题。 【参考方案1】:

将我的评论变成答案,因为这是您的解决方案。

您没有将服务器传递给 WebSocket 构造函数。 app 是一个请求处理程序。它不是服务器。 app.listen() 返回一个新创建的服务器对象。

从此更改您的代码:

app.listen(PORT, () => 
    console.log('started app');


const socket = new WebSocket.Server(server: app);

到这里:

const server = app.listen(PORT, () => 
    console.log('started app');


const socket = new WebSocket.Server(server: server);

查看app.listen() here 的代码。

app.listen = function listen() 
  var server = http.createServer(this);
  return server.listen.apply(server, arguments);
;

请参阅app.listen() here 的文档。

app.listen() 方法返回一个 http.Server 对象,并且(对于 HTTP)是一种方便的方法:

【讨论】:

以上是关于将 `express()` 和 `ws()` 对象导出到 Node 中的其他文件时出现问题?的主要内容,如果未能解决你的问题,请参考以下文章

在 express-ws 应用程序和打字稿中使用 Sessions

express-ws 中间件无法正确创建 websocket 服务器

如何实现 express-ws 路由

express-ws 部署到 VPS 服务器时不处理调用

为 Express 定义 Websocket 路由

NODEJS + WS 库 = 缓冲区分配错误