2015-11-08 56 views
2

我希望能夠從路由器和控制器文件訪問我的ensureAuthenticated函數(它位於app.js中)。Express.js MVC結構:「Route.get()需要回調」錯誤

app.js - >應用程序主頁

feed.js - >飼料路由器,什麼都不會發生在這裏。只是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; 

如果我擺脫app.js養活ensureAuthenticated功能。 JS,它的工作原理。

feedController.js

exports.index = function (req, res) { 
    res.sendStatus(req.id); 
}; 

錯誤

Error: Route.get() requires callback functions but got a [object Undefined]

回答

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

// ... 
+0

Aaaaand它的工作。非常感謝你。 – salep