2016-11-01 16 views
0

変数をモジュールに渡そうとしています。 Node.jsのでnodejsがパラメータをパラメータに渡す問題

I次の配布があります。

のNode.jsサーバー(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 

ルータ(my.router.js):

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

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

コントローラ(my.controller.js):

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

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

これは問題ありません。私の問題は、socket.ioを使って/ api/someが呼び出されたときにイベントを発行しようとするときに来ます。

私は、ルータを変更するようにサーバーを作成するために、Appオブジェクトが必要になります。

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); 
} 

そして、私は/ API /一部が呼び出されたときに、コントローラがイベントを発するように変更します。

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

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

コントローラ内部では、この作業を行うためにioオブジェクトが必要です。

もう少しnode.jsの知識がある人には聞こえるかもしれませんが、動作させることはできません。

私はapp.getようなものが必要でしょう( '/ API /一部'、myCtrl.something(IO))が、これは動作していない...

答えて

0

は、あなたは自分のコードを分割することはできません。

そして、この段階で
var server = require('http').createServer(app); 
var io = require('socket.io')(server); 

あなたのIOを持って、

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

あなたは、その後のような関数であるべきあなたのコントローラへのパラメータとしてIOを渡す:

/* 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'); 
    } 
} 

またはこれらの行に沿ったもの。

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 

コントローラ

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; 
}; 

ルート

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

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

あなたは異なる経路の間でデータを渡すために要求オブジェクトを使用することができます。

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); 
} 

とあなたのメインコントローラであなたが使用してアクセスします。そのほかに

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

はあなたのような構造を回避する必要があります。

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); 
} 

コードが大きくなるほどより多くの問題をあなたrequire('./my.router')ファイルを調べて、どのパス/プレフィックスがコードで処理されているかを確認する必要があるため、保守性があります。

代わりにそのように書く:

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; 
} 

そしてserver.js

var myRoutes = require('./my.router')(app); 
app.use('/api', myRoutes); 
関連する問題