如何在Node中的另一个控制器中调用一个控制器方法

所以我有一个控制器的方法定义为

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 

这在自己的类中运行良好,我可以通过localhost从外部调用它。 我想能够在另一个控制器中使用这两个。 所以在另一个文件

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()需要callback函数,但有一个[对象对象]。 我相信这不是一个数据库错误或连接错误,只是从controller2调用controller1函数的错误。 我已经尝试更改控制器1中的标题

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

这使获取控制器1无法调用该函数。

 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无论你需要controller1从路由器对象只是将其转换

 require('./cotroller1').router 

为了让你的代码保持干爽,你可以把所有的重复函数保存到辅助模块中。

结构可以是这样的:

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

在“index.js”辅助模块中,你可以包含你的function:

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

你可以像这样在控制器中调用它:

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

此外,你可以在这个线程中find其他相关的答案:

Javascript – 在NodeJS中构build助手函数的最佳方式