0

我在路由中使用 socket.io 时遇到问题。

在我的 app.js 中。我已经指定了我的路线。

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

我的路线有一个 index.js 文件

exports.index = function(req, res){
    res.render('index', { title: 'Example Title' });
    io.sockets.on('connection', function(socket){
    ...
    });
});

但是,我在 index.js 中不断收到错误“ReferenceError:io is not defined”。我需要将 io 对象传递到每个路由中还是在每个路由中都需要 socket.io?

4

2 回答 2

1

我将向您展示如何在我的应用程序中使用 socket.io,尽管我不确定这是否是这方面的最佳实践。

在我的 app.js 中,我有以下几行:

var io = require('socket.io').listen(server, { log: false });
routeRegistrar.init(app, io);

routeRegistrar是一个辅助功能,我简单地使用它来遍历每个控制器并注册其路由,请参阅:

var fs = require('fs');

var controllersFolder = "controllers";
var controllersFolderPath = __dirname + '/../' + controllersFolder + "/";

module.exports.init = function(app, io){
    fs.readdirSync(controllersFolderPath).forEach(function(controllerName){
        require(controllersFolderPath + controllerName).init(app, io);
    }); 
};

请注意,我将iovar 传播到每个控制器,因此每个控制器都可以使用它!在控制器中,我有以下内容:

var sockets; //see that this variable becomes global to the controller
module.exports.init = function(app, io) {
    app.get("/chat", chat);

    sockets = io.sockets;
    sockets.on('connection', function(socket) {
        //do any cool stuff here
    });
};

function chat(){
    //sockets is available here, at the route level - so do more cool stuff here
}
于 2012-11-12T13:39:15.367 回答
0

是的,您可以在您的路线中使用 socket.io。您收到错误“ReferenceError: io is not defined”,因为 io 未定义大声笑。您需要包含“var io = require('socket.io').listen(server)。这将在 app.js 中完美运行,因为在快速应用程序中,服务器被定义为“vas server = createServer(app)”您在应用程序中传递的位置。但是,为了在 routes/index.js 文件中声明服务器,您需要创建一个“全局服务器”,您可以从节点项目中的任何文件访问它。为此,我建议您创建一个 confg.json 文件,并创建一个 config.js 文件。

您的 config.json 文件应如下所示:

{
    "all": {
        "redis": {
            "port": 6379
          , "host": "127.0.0.1"
        }
    }
  , "development": {
        "env": "development"
      , "db": "mongodb://...development"
    }
  , "staging": {
        "env": "staging"
      , "db": "mongodb://...staging"
      , "redis": {
            "pass": ""
        }

    }
  , "production": {
        "env": "production"
      , "db": "mongodb://...production"
      , "redis": {
            "pass": ""
        }
    }
}

您的 config.js 文件应如下所示:

var env = process.env.NODE_ENV || 'development'
  , core = require('./config.json')

var merge = function (target, source) {
  for (var k in source) {
    if (typeof target[k] === 'object' && typeof source[k] === 'object')
      merge(target[k], source[k])
    else
      target[k] = source[k]
  }
}

module.exports = function (app) {
  global.config = {}

  merge(global.config, core.all)
  merge(global.config, core[env])

  global.config.app = {
      key: app.key
    , port: process.env.PORT || app.port
    , base: app.base
  }

  merge(global.config, app[env])
}


Now in app.js
require('./config')({
    key: 'pinpoint'
  , port: 3000
  , base: '/'
  , development: {
        app: {
            url: 'localhost:3000'
        }
    }
  , staging: {
        app: {
            url: 'localhost:3020'
        }
    }
})

var express = module.exports.express = require('express')
var bodyParser = require('body-parser');
var http = require('http');
var app = module.exports.app = express();
global.appserver = http.createServer(app);
var router = express.Router();
...

您现在已经成功创建了一个全局服务器,您可以在“routes/index.js”中访问它

Soooo 现在在你的 index.js 文件中你可以这样做:

global.io = require('socket.io').listen(global.appserver, { log:true});

io.sockets.on('connection', function(socket){
    console.log("#### socket.io connected. Port 3000"); 
    socket.on("scrape request", function(data) {
        console.log("in here");
        console.log(data);
    })
})

您不能在“连接时”功能中进行路由。但是,您可以执行 get/post 调用,该调用调用 get/post 调用之外的函数,该函数发出或接收数据。希望这可以帮助。

于 2014-10-08T17:41:24.993 回答