2015-11-08 51 views
2

我希望能够从路由器和控制器文件访问我的ensureAuthenticated函数(它位于app.js中)。Express.js MVC结构:“Route.get()需要回调”错误

app.js - >应用程序主页

feed.js - >饲料路由器,什么都不会发生在这里。只是URL的。

feedController.js - >应用程序逻辑在此处理。添加,删除,编辑帖子等

app.js

exports.ensureAuthenticated = function (req, res, next) { 
    next(); // does nothing atm 
}; 

feed.js(只是一个路由器)

var express = require('express'); 
var router = express.Router(); 
var jwt = require('jsonwebtoken'); 
var auth = require('../../app').ensureAuthenticated; 

var feedController = require('../../controllers/frontend/feed/feedController'); 

router.get('/feedtest', auth, feedController.index); 
module.exports = router; 

如果我摆脱app.js养活ensureAuthenticated功能。 JS,它的工作原理。

feedController.js

exports.index = function (req, res) { 
    res.sendStatus(req.id); 
}; 

错误

Error: Route.get() requires callback functions but got a [object Undefined]

回答

1

你似乎是处理循环依赖或cycle

app.js -> feed.js -> app.js -> feed.js -> ... 

当的Node.js遇到循环,它将只加载部分的两个模块中的一个 - 高达启动该循环的require()。它会完成加载该模块,评估任何剩余的语句并更新模块缓存,但直到它完成加载其他模块之后。

因此,语句的顺序,现在更显著内app.js

// ... 

// begins cycle, loading of `app.js` pauses here 
var feed = require('./routes/feed'); 

// has not yet been evaluated for `feed.js` to use, so remains `undefined` 
exports.ensureAuthenticated = function (req, res, next) { 
    next(); // does nothing atm 
}; 

相比:

// ... 

// evaluated before the cycle, included within the partial 
exports.ensureAuthenticated = function (req, res, next) { 
    next(); // does nothing atm 
}; 

// begins cycle, with `ensureAuthenticated` already defined 
var feed = require('./routers/feed'); 

您也可以提取ensureAuthenticated到一个单独的模块(例如auth.js ),每个依赖者可以要求并完全避免该周期:

auth.js

// ... 

exports.ensureAuthenticated = function (req, res, next) { 
    next(); // does nothing atm 
}; 

app.js

// ... 


// app.js -> feed.js -> auth.js 
var feed = require('./routes/feed'); 

// app.js -> auth.js 
var auth = require('./auth'); 

feed.js

// ... 

var auth = require('../../auth'); 

// ... 
+0

Aaaaand它的工作。非常感谢你。 – salep