Simple Error: Express 3 -> 4. Moving a controller and requesting index "Route.get() requires callback functions but got a [object Undefined]"

Simple Error: Express 3 -> 4. Moving a controller and requesting index "Route.get() requires callback functions but got a [object Undefined]"

您好,我见过类似的错误,但是 none 其中的错误适用于这种情况。我正在阅读 Getting Mean 书,但将 Express 3 上的所有课程应用到 Express 4 应用程序。

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

在routes/index.js

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

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

在app_server/controllers/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' });
// }; 

运行 应用在 res.render('index', { title: 'Loc8r' }) 上产生 "Error: Route.get() requires callback functions but got a [object Undefined]";行。

在这里已经有好几个小时了。非常感谢帮助。

错误可能是由 route/index.js 中的这一行引起的:

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

虽然 app_server/controllers/main.js 现在使用 express.Router,但 route/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'));