How to best structure an Express V4.11+ project with Socket.IO?

时间:2021-02-09 19:42:38

I've used the latest version of the express-generator (link) to generate a boilerplate Express 4.11.2 project.

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

I'm trying to figure out the best way of setting up Socket.IO 1.3.3 with the changes that have been made a few major versions back in the Express framework, where the http server was moved into its own bin/www file.

我正在尝试找出设置Socket.IO 1.3.3的最佳方法,其中包含已在Express框架中返回几个主要版本的更改,其中http服务器被移动到其自己的bin / www文件中。

I'm getting confused because it seems like I need the express server in app.js, before it gets exported to bin/www.

我感到困惑,因为在导出到bin / www之前,似乎我需要app.js中的快速服务器。

I've tried Googling for a few hours now and come up with nothing, it seems that the Express framework is moving so fast that all of the previous articles are outdated.

我已经尝试了几个小时的谷歌搜索并且没有任何结果,似乎Express框架的移动速度太快以至于所有以前的文章都已过时。

Any help would be greatly appreciated!

任何帮助将不胜感激!

I've included the two files in question below so you can see what I'm working with after generating the boilerplate express project.

我在下面列出了两个有问题的文件,这样您就可以在生成样板快速项目后看到我正在使用的内容。

bin/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;

1 个解决方案

#1


8  

A lot of info about socket.io and express are out of date due to their popularity and fast changing pace.

关于so​​cket.io和express的很多信息由于受欢迎程度和快速变化的步伐而过时。

This is what I ended up doing, by no means it's the best.

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

I would create a sockets.js at the same level as app.js, so you can separate all socket.io initialization logic.

我将创建一个与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;

And in your bin/www file, you can initialize socket.io like this:

在你的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);

#1


8  

A lot of info about socket.io and express are out of date due to their popularity and fast changing pace.

关于so​​cket.io和express的很多信息由于受欢迎程度和快速变化的步伐而过时。

This is what I ended up doing, by no means it's the best.

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

I would create a sockets.js at the same level as app.js, so you can separate all socket.io initialization logic.

我将创建一个与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;

And in your bin/www file, you can initialize socket.io like this:

在你的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);