【问题标题】:Issue exporting `express()` and `ws()` objects to other files in Node?将 `express()` 和 `ws()` 对象导出到 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 是一个坏主意,也是一个不好的开始趋势。以正确的方式解决问题。

标签: node.js express websocket


【解决方案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)是一种方便的方法:

【讨论】:

    猜你喜欢
    • 2017-09-28
    • 2012-04-17
    • 1970-01-01
    • 2016-04-12
    • 1970-01-01
    • 2017-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多