2016-07-05 40 views
1

所以我有一個控制器,定義爲如何在節點調用一個控制器方法在另一個控制器

controller1.js

router.get('/:id/:field', function(req,res){ 
    var regex = /action|protocol|ip|port|direction|dip|dport|signature/; 
    if (regex.test(req.params.field)){ 
     get(req,res,function(r){ 
     var field = req.params.field; 
     res.status(200).send(r[field]); 
     }); 
    } else { 
     res.status(404).send("Signature Field Does Not Exist"); 
    } 
}); 

function get(req, res, cb){ 
    MongoClient.connect(url, function(err, db) { 
    if (err){ 
     console.error("Could not connect to database: %s",err); 
     res.sendStatus(500); 
    } else { 
     var _id = req.params.id 
     var collection = db.collection("signatures"); 
     var uniqueID = {"_id":_id}; 
     var cursor = collection.find(uniqueID); 
     cursor.hasNext(function (err, r) { 
      if (err) {console.log(err);} 
      else { 
      cursor.next(function(err,r) { 
       if (r == null){ 
       res.status(404).send("Signature not found"); 
       } else { 
        cb(r); 
        db.close(); 
       } 
      });  
      }  
     }); 
    } 
    }); 
} 
module.exports = router 

這非常適用於自己的類,我可以調用一個方法它從外部通過本地主機。我希望能夠在另一個控制器中使用這兩個。因此,在另一個文件

controller2.js

var controller1 = require("./controller1.js"); 
router.get('/', function(req,res){ 
    controller1.get(req,res,cb(r){ 
     res.status(200).send(r); 
    }); 
}); 

當我嘗試打電話得到controller2.js我得到錯誤:Route.get()需要回調函數,但有一個[對象的對象。我確信它不是一個數據庫錯誤或連接錯誤,只是從controller2調用controller1函數時出現錯誤。我嘗試更改控制器1中的標頭爲

router.get = function(req,res,cb){ 
    .... 
}); 

這使得在控制器1中無法調用該函數。

回答

0
If you still want to follow this approach the solution is 
router.get('/:id/:field', function(req,res){ 
    var regex = /action|protocol|ip|port|direction|dip|dport|signature/; 
    if (regex.test(req.params.field)){ 
     get(req,res,function(r){ 
     var field = req.params.field; 
     res.status(200).send(r[field]); 
     }); 
    } else { 
     res.status(404).send("Signature Field Does Not Exist"); 
    } 
}); 

var get=function(req, res, cb){ 
    MongoClient.connect(url, function(err, db) { 
    if (err){ 
     console.error("Could not connect to database: %s",err); 
     res.sendStatus(500); 
    } else { 
     var _id = req.params.id 
     var collection = db.collection("signatures"); 
     var uniqueID = {"_id":_id}; 
     var cursor = collection.find(uniqueID); 
     cursor.hasNext(function (err, r) { 
      if (err) {console.log(err);} 
      else { 
      cursor.next(function(err,r) { 
       if (r == null){ 
       res.status(404).send("Signature not found"); 
       } else { 
        cb(r); 
        db.close(); 
       } 
      });  
      }  
     }); 
    } 
    }); 
} 
module.exports.router = router 
module.exports.get = get 


In controller2 
var controller1 = require("./controller1.js"); 
router.get('/', function(req,res){ 
    controller1.get(req,res,cb(r){ 
     res.status(200).send(r); 
    }); 
}); 
will work 

只是做一些改變accordinly 無論你從路由器對象要求控制器1只將其轉換成

require('./cotroller1').router 
1

要保持您的代碼DRY您可以保留所有重複功能到輔助模塊中。

的結構可以是這樣的:

controllers 
├── helpers 
    └── index.js 
├── controller1.js 
└── controller2.js 

在「index.js」輔助模塊,您可以包括你的函數是這樣的:

exports.yourFunction = function(args){ 
... 
}; 

而且你可以把它在這樣的控制器:

var helpers = require("./helpers"); 
... 
helpers.yourFunction(); 

此外,您可以在此主題中找到其他相關答案:

Javascript - Best way to structure helpers functions in NodeJS

相關問題