Express-Generator - 包括 socket.io (bin/www)

Posted

技术标签:

【中文标题】Express-Generator - 包括 socket.io (bin/www)【英文标题】:Express-Generator - Including socket.io (bin/www) 【发布时间】:2015-02-25 01:47:59 【问题描述】:

我一直有点像 Perl/php 类型的人,但我想改变一下,Node JS 似乎是我下一步要去的地方。

我已经在 YouTube 上观看了好几个小时的教程,并在这里阅读了一些帖子 - 但我有点卡住了。

我想在我的 express 生成的应用程序 (v4.10.6) 中包含 socket.io。 但与此同时,我真的不想将 socket.on(...) 语句包含在一个文件中——我更愿意像使用路由一样将其拆分。

鉴于 express 生成的应用程序是在 bin/www 中启动的,我很困惑我需要在哪里 require('socket.io') 并指向所有 'on' 事件到。

This post on ***,我想可能会回答我的问题 - 但它表明所有套接字处理程序都在 ./sockets/base.js 文件中 - 我对 Gofilord 对回答。

请原谅我在这里的无知 - 目前这一切对我来说有点陌生,感谢您一如既往地花时间阅读本文并提供您的帮助。

/bin/www

#!/usr/bin/env node
var debug   = require('debug')('rhubarb');
var app     = require('../app');

app.set('port', process.env.PORT || 1127);

var server = app.listen(app.get('port'), function() 
  debug('Express server listening on port ' + server.address().port);
);

【问题讨论】:

【参考方案1】:

在 app.js 中需要 socket.io 然后告诉你的 io 服务器监听你的应用程序是典型的。使用您发布的示例,它看起来像这样:

var debug   = require('debug')('rhubarb');
var app     = require('../app');
var server  = require('http').Server(app);
var io      = require('socket.io')(server);

app.set('port', process.env.PORT || 1127);

var server = server.listen(app.get('port'), function() 
  debug('Express server listening on port ' + server.address().port);
);

socketio docs 很好地解释了这一点。这是他们主页上的一个例子:

var app = require('express')();
var server = require('http').Server(app);
var io = require('socket.io')(server);

server.listen(80);

app.get('/', function (req, res) 
  res.sendfile(__dirname + '/index.html');
);

io.on('connection', function (socket) 
  socket.emit('news',  hello: 'world' );
  socket.on('my other event', function (data) 
    console.log(data);
  );
);

更新:

我通常通过在/lib 中创建一个名为 io.js 的库来模块化 socketio 设置,如下所示:

module.exports = function(server)
  var io = require('socket.io')(server);

  // catch errors
  io.on('error', function(err)
    throw err;
  )

  // Set Socket.io listeners by creating a socket.io middleware
  // attachEventlisteners would live in `/controllers`
  io.use(attachEventlisteners);

  io.on('connection', function (socket) 

    // do things

  );

  return io; // so it can be used in app.js ( if need be )

然后在 app.js 中,我可以在需要时简单地传递 server

  var io = require('./lib/io')(server);

你不需要在 app.js 中做任何进一步的事情,因为一切都在/lib/io.js 中设置,但如果你愿意,你可以因为返回 io 服务器。

【讨论】:

非常感谢@agconti - 我仍在努力在脑海中凝聚在一起。现在 socket.io 包含在 /bin/www 中 - 我可以问在哪里放置我的 io.on('connection'... 代码以模块化方式为每个页面放置(例如“关于”、“联系方式”等)好吗? @doublelateralstickytape 不过,这些确实是独立的问题。如果这两个答案都对您有用,那么最好提出另一个关于模块化 socketio 的问题。这样我们就可以帮助遇到同样问题的其他人。 我需要一些时间来消化您的回复并确保我理解它;但我非常感谢您花时间帮助我 - 再次感谢您@agconti :) @doublelateralstickytape 没问题! 我正在寻找模块化我的套接字 io 实现,但我很困惑。您是否有机会发布io.use(attachEventlisteners); 的示例,以便我可以看到您如何从控制器连接到 io?

以上是关于Express-Generator - 包括 socket.io (bin/www)的主要内容,如果未能解决你的问题,请参考以下文章

express-generator 自动生成服务器基本文件

在 express-generator 中使用 bin 文件而不是 .js 的好处

带有 express-generator 的 Nodejs 应用程序,并尝试添加 primus websocket

用express-generator创建express项目骨架

nodejs脚手架express-generator

脚手架express-generator创建项目