如何使用Socket.IO最佳地构buildExpress V4.11 +项目?

我已经使用了最新版本的快速生成器 ( 链接 )来生成样板Express 4.11.2项目。

我试图找出设置Socket.IO 1.3.3的最好方法,在Express框架中,http服务器被移动到它自己的bin/www文件中。

我感到困惑,因为它似乎我需要app.js的快递服务器,在它被导出到bin/www

我已经尝试了几个小时的Googlesearch,并没有得到任何东西,似乎Express框架正在移动如此之快,以前的所有文章都过时了。

任何帮助将不胜感激!

我将下面的两个文件包括在内,以便在生成样板快速项目后可以看到我正在处理的内容。

斌/ WWW

 #!/usr/bin/env node /** * Module dependencies. */ var app = require('../app'); var debug = require('debug')('Express-Socket:server'); var http = require('http'); /** * Get port from environment and store in Express. */ var port = normalizePort(process.env.PORT || '3000'); app.set('port', port); /** * Create HTTP server. */ var server = http.createServer(app); /** * Listen on provided port, on all network interfaces. */ server.listen(port); server.on('error', onError); server.on('listening', onListening); /** * Normalize a port into a number, string, or false. */ function normalizePort(val) { var port = parseInt(val, 10); if (isNaN(port)) { // named pipe return val; } if (port >= 0) { // port number return port; } return false; } /** * Event listener for HTTP server "error" event. */ function onError(error) { if (error.syscall !== 'listen') { throw error; } var bind = typeof port === 'string' ? 'Pipe ' + port : 'Port ' + port // handle specific listen errors with friendly messages switch (error.code) { case 'EACCES': console.error(bind + ' requires elevated privileges'); process.exit(1); break; case 'EADDRINUSE': console.error(bind + ' is already in use'); process.exit(1); break; default: throw error; } } /** * Event listener for HTTP server "listening" event. */ function onListening() { var addr = server.address(); var bind = typeof addr === 'string' ? 'pipe ' + addr : 'port ' + addr.port; debug('Listening on ' + bind); } 

app.js

 var express = require('express'); var path = require('path'); var favicon = require('serve-favicon'); var logger = require('morgan'); var cookieParser = require('cookie-parser'); var bodyParser = require('body-parser'); var routes = require('./routes/index'); var users = require('./routes/users'); var app = express(); // view engine setup app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'ejs'); // uncomment after placing your favicon in /public //app.use(favicon(__dirname + '/public/favicon.ico')); app.use(logger('dev')); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: false })); app.use(cookieParser()); app.use(express.static(path.join(__dirname, 'public'))); app.use('/', routes); app.use('/users', users); // catch 404 and forward to error handler app.use(function(req, res, next) { var err = new Error('Not Found'); err.status = 404; next(err); }); // error handlers // development error handler // will print stacktrace if (app.get('env') === 'development') { app.use(function(err, req, res, next) { res.status(err.status || 500); res.render('error', { message: err.message, error: err }); }); } // production error handler // no stacktraces leaked to user app.use(function(err, req, res, next) { res.status(err.status || 500); res.render('error', { message: err.message, error: {} }); }); module.exports = app; 

很多关于socket.io和express的信息由于其stream行性和快速变化的速度而过时了。

这是我最终做的,绝不是最好的。

我将创build一个与app.js相同级别的sockets.js,这样就可以分离所有的socket.io初始化逻辑。

 var sockets = {}; sockets.init = function (server) { // socket.io setup var io = require('socket.io').listen(server); io.sockets.on('connection', function (socket) { console.log('socket connected'); // other logic }); } module.exports = sockets; 

在你的bin / www文件中,你可以像这样初始化socket.io:

 #!/usr/bin/env node var debug = require('debug')('yourProject'); var app = require('../app'); var sockets = require('../sockets') app.set('port', process.env.PORT || 3000); var server = app.listen(app.get('port'), function() { debug('Express server listening on port ' + server.address().port); }); sockets.init(server);