我希望能够从路由器和控制器文件访问我的ensureAuthenticated函数(它位于app.js中)。
app.js - >申请主页
feed.js - > Feed路由器,这里什么都没发生。只是网址。
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;
如果我将ensureAuthenticated函数从app.js移到feed.js,它就可以了。
feedController.js
exports.index = function (req, res) {
res.sendStatus(req.id);
};
错误
错误:Route.get()需要回调函数,但得到了一个[对象 未定义]
答案 0 :(得分: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');
// ...