0

我有一个准系统 express 应用程序,正是使用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 引用错误,因为路由文件是一个可导出的模块,并且显然不知道套接字是什么,因为它位于 app.js 文件中。

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


额外:如何获取/设置会话数据?

提前致谢。

4

1 回答 1

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 ,然后它对侦听套接字服务进行连接调用(注意,您可能希望更改 io.connect 中的 localhost将 index.html 调用到您的服务器上)。

于 2012-12-07T16:38:03.380 回答