2015-02-06 26 views
1

嗨我看過類似的錯誤,但它們都不適用於此環境。我正在通過「中庸之道」書,但將Express 3上的所有課程應用到Express 4應用程序。簡單錯誤:Express 3 - > 4.移動控制器並請求索引「Route.get()需要回調函數,但得到了[對象未定義]」

在app.js

app.set('views', path.join(__dirname, 'app_server/views')); 
//index.jade is located here and confirmed to work before moving controller 
... 
require('./routes')(app); 
//Instead of app.use('/', routes); 

在路由/ index.js

var ctrl = require('../app_server/controllers/main'); 

module.exports = function (app) { 
    app.get('/', ctrl.index); 
}; 

在APP_SERVER /控制器/ main.js

var express = require('express'); 
var router = express.Router(); 

router.get('/', function(req, res, next) { 
    res.render('index', { title: 'Loc8r' }); 
}); 

// /* Also tried */ 
// exports.index = function(req, res){ 
// res.render('index', { title: 'Express' }); 
// }; 

運行該應用的產率「錯誤: Route.get()需要回調函數,但在res.render('index',{title:'Loc8r'})上有一個[object Undefined]線。

在這裏呆了幾個小時。非常感謝幫助。

回答

0

該錯誤可能是由該行route/index.js造成的:

app.get('/', ctrl.index); 

雖然app_server/controllers/main.js現在利用了express.Routerroute/index.js尚未更新相匹配。它仍然期待ctrl.index,這不再被定義。

console.log(ctrl);  // {} 
console.log(ctrl.index); // undefined 

app_server/controllers/main.js應該導出Router它的定義:

var express = require('express'); 
var router = module.exports = express.Router(); 
//   ^^^^^^^^^^^^^^ 

// ... 

所以它可以在routes/index.js作爲中間件:

module.exports = function (app) { 
    app.use(require('../app_server/controllers/main')); 
}; 

[編輯]回覆褒貶我的評論如下:

/** app_server/controllers/main.js **/ 
var express = require('express'); 
var router = module.exports = express.Router(); 

// ... 
/** routes/index.js **/ 
var express = require('express'); 
var router = module.exports = express.Router(); 

router.use(require('../app_server/controllers/main.js')); 
// ... 
// router.use('/area1', require('../app_server/controllers/area1.js')); 
// router.use('/area2', require('../app_server/controllers/area2.js')); 
/** app.js **/ 
// ... 

app.use(require('./routes')); 
+0

謝謝你這個工作!它說我不能投票,因爲我需要15個代表...:\ – boblikesoup 2015-02-06 23:30:56

+0

我很好奇爲什麼我不能在index.js中定義app = require('express'),而不是必須通過require( 」 ./routes')(app); – boblikesoup 2015-02-07 00:26:19

+0

@boblikesoup'require('express')'只會爲您提供應用程序的'express()'構造函數,而不是您創建的'app'實例。 'require('./app')'可以訪問你創建的實例,但是如果'app.js'也需要其他模塊,這會創建[模塊週期](http://nodejs.org /api/modules.html#modules_cycles)。你還可以在'routes/index'中使用另一個'Router'來從你的控制器中收集這些信息,而在'app.js'中收集'.use()'作爲其他任何中間件。 – 2015-02-07 21:36:32

相關問題