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

Spo*_*og1 3 javascript node.js express

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

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
Run Code Online (Sandbox Code Playgroud)

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

controller2.js

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

当我尝试在controller2.js中调用get时,我得到了错误:Route.get()需要回调函数,但是得到了[object Object]。我确定这不是数据库错误或任何形式的连接错误,而仅仅是从controller2调用controller1函数时发生的错误。我尝试将controller1中的标头更改为

router.get = function(req,res,cb){
    ....
});
Run Code Online (Sandbox Code Playgroud)

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

Mik*_*ike 5

为了使代码保持干燥,可以将所有重复功能保留在帮助程序模块中。

结构可以是这样的:

controllers  
??? helpers  
    ??? index.js  
??? controller1.js   
??? controller2.js  
Run Code Online (Sandbox Code Playgroud)

在“ index.js”帮助器模块中,您可以包含如下功能:

exports.yourFunction = function(args){
...
};
Run Code Online (Sandbox Code Playgroud)

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

var helpers = require("./helpers");
...
helpers.yourFunction();
Run Code Online (Sandbox Code Playgroud)

另外,您可以在此线程中找到其他相关答案:

Javascript-在NodeJS中构造辅助函数的最佳方法


小智 2

如果您仍然想遵循这种方法,解决方案是:

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
Run Code Online (Sandbox Code Playgroud)

只需做一些相应的改变即可。无论您在哪里需要来自路由器对象的controller1,只需将其转换为:

require('./cotroller1').router
Run Code Online (Sandbox Code Playgroud)