将 `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