我希望能够从路由器和 Controller 文件访问我的 EnsureAuthenticated 函数(它位于 app.js 中)。
app.js -> 应用程序主页
feed.js -> Feed 路由器,这里没有任何反应。只是 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;
如果我将 EnsureAuthenticated 函数从 app.js 移动到 feed.js,它就可以工作。
feedController.js
exports.index = function (req, res) {
res.sendStatus(req.id);
};
错误
Error: Route.get() requires callback functions but got a [object Undefined]
最佳答案
您似乎正在处理循环依赖或 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');
// ...
关于node.js - Express.js MVC结构: "Route.get() requires callback" error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33591014/