Express.js MVC结构:“Route.get()需要callback”错误
我希望能够从路由器和控制器文件访问我的ensureAuthenticated函数(它位于app.js中)。
app.js – >应用程序主页面
feed.js – > Feed路由器,这里没有任何反应。 只是URL的。
feedController.js – >应用程序逻辑在这里处理。 添加,删除,编辑post等
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()需要callback函数,但有一个[对象未定义]
你似乎在处理循环依赖或循环 。
app.js -> feed.js -> app.js -> feed.js -> ...
当Node.js遇到一个循环时,它只会部分加载两个模块中的一个 – 直到启动循环的require()
。 它会完成加载该模块,评估任何剩余的语句和更新模块caching,但直到它完成加载其他模块之后。
所以,这个语句的顺序现在在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'); // ...