2016-07-05 44 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

相关问题