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'); // ...