所以我有一个控制器,其方法定义为
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中调用get时,我得到错误:Route.get()需要回调函数,但得到了[object Object]。我确信这不是数据库错误或任何类型的连接错误只是从controller2调用controller1函数时出错。我已经尝试将controller1中的标题更改为
router.get = function(req,res,cb){
....
});
这使得控制器1中的get1无法调用该函数。
答案 0 :(得分:3)
要保留代码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
答案 1 :(得分:0)
如果您仍想遵循此方法,解决方案是:
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
相应地做一些改变。 无论您何时需要来自路由器对象的controller1,只需将其转换为:
require('./cotroller1').router
答案 2 :(得分:0)
var test = require("./test");
...
test.myFun();