Express.js MVC结构:“Route.get()需要回调”错误

时间:2015-11-08 05:19:12

标签: node.js express

我希望能够从路由器和控制器文件访问我的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()需要回调函数,但得到了一个[对象   未定义]

1 个答案:

答案 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');

// ...