2016-11-01 6 views
0

Ich habe Kopfschmerzen und versuche, eine Variable an das Modul zu übergeben.nodejs Probleme bei der Übergabe eines Parameters an das Modul

In node.js Ich habe die folgende Verteilung:

Der node.js Server (server.js):

// modules ================================================= 
var express  = require('express'); 
var app   = express(); 

// configuration =========================================== 
app.set('port', process.env.PORT || 3000); 
var myRoutes = require('./my.router')(app); 

// Start the Server =========================================== 
app.listen(app.get('port'), function() { 
    console.log('Express server listening on port ' + app.get('port')); 
}); 

exports = module.exports = app; // expose app 

Der Router (my.router.js):

var myCtrl = require('./my.controller'); 

module.exports = function(app) { 
    app.get('/api/some', myCtrl.some); 
    app.get('/api/other', myCtrl.other); 
} 

die Steuerung (my.controller.js):

exports.some = function(req, res, next) { 
      res.send('some'); 
}; 

exports.other = function(req, res, next) { 
      res.send('other'); 
} 

Das funktioniert ok. Meine Probleme treten auf, wenn ich versuche, socket.io zu verwenden und ein Ereignis auszulösen, wenn/api/some aufgerufen wird.

Ich brauche das App-Objekt, den Server zu erstellen, so dass ich den Router zu ändern:

var myCtrl = require('./my.controller'); 

module.exports = function(app) { 

    var server = require('http').createServer(app); 
    var io = require('socket.io')(server); 
    server.listen(3001); 


    app.get('/api/some', myCtrl.something); 
    app.get('/api/other', myCtrl.other); 
} 

Und ich ändern Sie den Controller das Ereignis zu emittieren, wenn sie/api/einige genannt:

exports.some = function(req, res, next) { 
      io.sockets.emit('my_event', {}); 
      res.send('some'); 
}; 

exports.other = function(req, res, next) { 
      res.send('other'); 
} 

In der Steuerung brauche ich das io-Objekt, um das zu machen.

Es klingt einfach für jemanden mit ein bisschen mehr Wissen über node.js, aber ich bin nicht in der Lage, es zum Laufen zu bringen.

Ich würde so etwas wie app.get müssen ('/ api/some', myCtrl.something (io)), aber das funktioniert nicht ...

Antwort

0

Sie können nicht geteilt nur Ihr Code:

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

In diesem Stadium Sie io, dann

var myCtrl = require('./my.controller')(io); 

Sie übergeben den io als Parameter an Ihrem Controller, die dann eine Funktion sein sollte:

/* my.controller.js */ 

module.exports = function(io) { 
    some: function(req, res, next) { 
     io.sockets.emit('my_event', {}); 
     res.send('some'); 
    }, 

    other: function(req, res, next) { 
     res.send('other'); 
    } 
} 

Oder etwas in diese Richtung.

0
// modules ================================================= 
var express  = require('express'); 
var app   = express(); 

// configuration =========================================== 
app.set('port', process.env.PORT || 3000); 
var server = require('http').createServer(app); 
app.io = require('socket.io')(server); //add io key to app 
server.listen(3001); 

require('./my.router')(app); 
app.Controllers = {}; 
app.Controllers.myCtrl = require('./my.controller')(app); //pass app to controllers as well (not necessary but you can bootstrap your controllers at the start instead of requiring them in files) 
//app.Controllers.anotherCtrl = require('./my.anotherController')(app); //example 

// Start the Server =========================================== 
app.listen(app.get('port'), function() { 
    console.log('Express server listening on port ' + app.get('port')); 
}); 

exports = module.exports = app; // expose app 

-Controller

module.exports = function(app) { 
    var Controller = {}; 
    var io = app.io; 

    Controller.some = function(req, res, next) { 
     io.sockets.emit('my_event', {}); 
     res.send('some'); 
    }; 

    Controller.other = function(req, res, next) { 
     res.send('other'); 
    } 

    return Controller; 
}; 

Strecke

module.exports = function(app) { 
    var myCtrl = app.Controllers.myCtrl; 

    app.get('/api/some', myCtrl.some); 
    app.get('/api/other', myCtrl.other); 
} 
0

können Sie das Anfrage-Objekt verwenden, um die Daten zwischen verschiedenen Routen zu übergeben.

module.exports = function(app) { 

    var server = require('http').createServer(app); 
    var io = require('socket.io')(server); 
    server.listen(3001); 

    //middleware used to assign 'io' to the request object 
    function passIoObject(req, res, next) { 
    req.myIo = io; 
    next() 
    } 

    // either use app.use(passIoObject) if io should be available for all following routes 
    // or pass it only to specific routes 
    app.get('/api/some', passIoObject, myCtrl.something); 
    app.get('/api/other', myCtrl.other); 
} 

und in Ihrem Haupt-Controller möchten Sie darauf zugreifen mit:

module.exports = function(app) { 

    var server = require('http').createServer(app); 
    var io = require('socket.io')(server); 
    server.listen(3001); 

    app.get('/api/some', myCtrl.something); 
    app.get('/api/other', myCtrl.other); 
} 

Je größer Sie die mehr Probleme der Code wird:

exports.some = function(req, res, next) { 
    req.myIo.sockets.emit('my_event', {}); 
    res.send('some'); 
} 

Neben, dass man ein Konstrukt wie vermeiden sollten wird mit Wartbarkeit haben, weil Sie immer in die require('./my.router') Datei schauen müssen, um zu sehen, welche Pfade/Präfix vom Code gehandhabt werden.

Stattdessen es so schreiben:

module.exports = function(app) { 

    var server = require('http').createServer(app); 
    var io = require('socket.io')(server); 
    server.listen(3001); 

    var router = express.Router(); 

    router.get('/some', myCtrl.something); 
    router.get('/other', myCtrl.other); 

    return router; 
} 

Und in server.js

var myRoutes = require('./my.router')(app); 
app.use('/api', myRoutes); 
Verwandte Themen