1

嗨,我见过类似的错误,但没有一个适用于这种情况。我正在阅读 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);

在路线/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' }); 上产生“错误:Route.get() 需要回调函数但得到 [object Undefined]” 线。

一直在这几个小时。非常感谢您的帮助。

4

1 回答 1

0

该错误可能是由以下行引起的route/index.js

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

虽然app_server/controllers/main.js现在使用express.Router,route/index.js尚未更新以匹配。它仍然期待 a 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'));
于 2015-02-06T20:58:39.730 回答