2017-12-07 5 views
0

Ich habe Express-Generator verwendet, um meine App-Skelett zu erstellen, und da meine Datei, die den Server erstellt und meine Routen getrennt sind, weiß ich nicht, wo Sie den Socket.io-Code einrichten. Die Tutorials haben normalerweise den Server-Code, den Socket.io-Code und die Routen in einer Datei.In welcher Datei soll ich Socket.io konfigurieren, wenn ich bedenke, dass ich Express verwende?

app.js enthält:

var routes = require('./routes/'); 
var express = require('express'); 
var path = require('path'); 
var logger = require('morgan'); 
var cookieParser = require('cookie-parser'); 
var bodyParser = require('body-parser'); 
var expressSession = require('express-session'); 

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(path.join(__dirname, 'public', 'favicon.ico'))); 
app.use(logger('dev')); 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ extended: false })); 
app.use(cookieParser()); 
app.use(expressSession({ 
        secret: 'secretText', 
        saveUninitialized: true, 
        resave: true 
       })) 
app.use(express.static(path.join(__dirname, 'public'))); 

app.use('/', routes.home); 

// 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 handler 
app.use(function(err, req, res, next) { 
    // set locals, only providing error in development 
    res.locals.message = err.message; 
    res.locals.error = req.app.get('env') === 'development' ? err : {}; 

    // render the error page 
    res.status(err.status || 500); 
    res.render('error'); 
}); 

module.exports = app; 

www enthält:

#!/usr/bin/env node 

/** 
* Module dependencies. 
*/ 

var app = require('../app'); 
var debug = require('debug')('myapp:server'); 
var http = require('http'); 

/** 
* Get port from environment and store in Express. 
*/ 

var port = normalizePort(process.env.PORT || '8087'); 
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); 
} 

home.js

var express = require('express'); 
var router = express.Router(); 
var db = require('../helpers/db'); 

router.get('/', function(req, res, next) { 
    res.send("Hello"); 
}); 

module.exports = router; 

index.js

var home = require('./home'); 

module.exports = { 
    home 
}; 

Antwort

1

Wie bei allen Modul-Designs und -Layouts in node.js gibt es keine "richtige" Antwort. Es hängt von Ihren eigenen Design-Ideen ab, wie viel Code Sie von verschiedenen Typen haben, welcher Code mit welchen Teilen usw. teilen soll. Als solcher kann ich einige Ideen anbieten und Sie können auswählen, was Ihnen gefällt.

  1. Wenn der Server-Seite socket.io Code ziemlich minimal ist, können Sie sind es gerade in www, wo der Server initialisiert wird (da Sie den Zugriff auf das Server-Objekt müssen dort).

  2. Wenn Sie Ihren serverseitigen socket.io-Code in einem eigenen Modul haben möchten, können Sie ihn in ein eigenes Modul/eine eigene Datei einfügen und diese Datei in Ihre www-Datei importieren, genauso wie Sie app.js und Haken Sie dann das app Objekt an Ihren Server. Entsprechend würden Sie die socket.io-Instanz in Ihrem socket.io-Modul erstellen und diese Instanz dann in www importieren und auf Ihrem Server speichern.

  3. Wenn Sie eine große Code-Freigabe zwischen Ihrem socket.io-Code und Ihrem app.js-Code haben oder socket.io-Aufrufe von Ihren app.js-Routen ausführen müssen, sollten Sie socket.io importieren Code in Ihre app.js Code und dann beide app und socket.io Instanz von app.js exportieren, so dass www kann dann beide aufhängen.

Verwandte Themen