从其他模块访问所需的模块

时间:2012-12-07 15:48:10

标签: node.js module

我有一个裸露的快速应用程序,正是使用express命令创建的应用程序。

我已经安装了socket.io并将其附加到我的服务器上,如下所示:

var app = express(),
    server = http.createServer(app),
    io = io.listen(server);

server.listen(8000);

现在,我还有路径文件,这样称为:

app.get('/', routes.index);

在这个模块中,我有以下功能:

exports.index = function(req, res){
  socket.emit('news', { message: "foo" });
};

这个显然会导致500引用错误,因为routes文件是一个可导出的模块,显然不知道套接字是什么,因为它位于app.js文件。

有没有办法可以从这个或任何其他文件访问此套接字对象?请注意它已附加到快速生成的应用程序。以下是该项目的链接:http://jsfiddle.net/E27yN


额外:获取/设置会话数据怎么样?

提前致谢。

1 个答案:

答案 0 :(得分:1)

如果我正确地阅读此内容,我遇到了一个非常类似的问题:Handling Node.js Async Returns with "require" (Node ORM)

我解决它的方法是通过对require进行函数调用,然后在我的导出中返回该函数,然后可以通过该局部变量访问它。在你的情况下,我认为它是这样的:

var routes = require("routes.js")(io);
console.log(routes.index()); // will log return of the function "index" in routes.js.

// in routes.js
module.exports = function(io) {
  var exports = this;
  exports.index = function(req,res,io) {
    // now io.socket is available to routes
    console.log(io); 
  }
  return exports;
}

现在,您可以使用该变量访问已导出的内容。因此,获取和设置会话数据将是从正确的位置获取信息并在父文件中修改它的问题(通常是您使用节点启动的任何内容,例如app.js或者您有什么)。

希望这有帮助!

编辑:在评论中讨论了这个之后,我认为问题是你在同一个端口上尝试使用express和socket.io。

他们在您的链接(http://socket.io/#how-to-use)中提供的示例实际上表明他们正在从app.get(“/”)提供index.html。 Index.html包含socket.io脚本文件(),默认情况下,在启动套接字服务器时提供该文件。

这看起来像这个jsfiddle:http://jsfiddle.net/Lytpx/

请注意,您通过express提供index.html页面,但您的套接字服务实际上提供了/socket.io.js,然后对侦听套接字服务进行连接调用(注意,您可能希望更改localhost中的localhost)在index.html中调用io.connect来调用你的服务器。