一旦我开始添加文件到我的控制器文件夹代码中断 – 为什么?

我使用节点,expression,FS和一些其他的东西来创build我的第一个MVC框架应用程序。 我现在正在search更多关于我遇到的错误,但没有find我正在寻找的清晰度。 现在,当我将所有的代码保存在我的server.js文件中时,我没有收到错误。 但是这不是什么MVC的,所以在某些时候,我创build了一个users_controller.js文件开始移动到下面的路线(除了('/')路线)。 一旦我这样做,一切都打破了!

我得到的错误是=> TypeError: undefined is not a function

被引用的行是=> route.controller(app);

这里是代码:

 var express = require('express'); var logger = require('morgan'); var path = require('path'); var exphbs = require('express-handlebars'); var bodyParser = require('body-parser'); var methodOverride = require('method-override'); var session = require('express-session'); var cookieParser = require('cookie-parser'); var pg = require('pg'); var bcrypt = require ('bcrypt'); var fs = require('fs'); var app = express(); var db = require('./db.js'); app.listen(3000); app.engine('handlebars', exphbs({defaultLayout: 'main', extname: 'handlebars'})); app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'handlebars'); //app.use(session({ secret: 'app', cookie: { maxAge: 60000 }})); app.use(session({ secret: 'app', resave: true, saveUninitialized: true })); app.use(bodyParser.urlencoded({extended: true})); app.use(express.static('public')); app.use(logger('dev')); // look in url encoded POST bodies and delete it app.use(methodOverride(function(req, res) { if (req.body && typeof req.body === 'object' && '_method' in req.body) { var method = req.body._method; delete req.body._method; return method; } })); //says look in the controllers folder for these routes // dynamically include routes (Controller) fs.readdirSync('./controllers').forEach(function (file) { if(file.substr(-3) == '.js') { route = require('./controllers/' + file); route.controller(app); ///// <================= error ======= } }); ////check if session does not exist app.get('/', function (req, res) { if(!req.session.name) { res.redirect('/loginform'); } else { res.send("WELCOME BACK" + req.session.name); } }); ///////renders login form if not logged in app.get('/loginform', function (req, res) { res.render('login'); }); ///authenticates a login app.post('/login', function (req, res){ db.findByColumn('users', 'username', req.body.name, function (data){ console.log(data); bcrypt.compare(req.body.password, data[0].password_digest, function (err, result){ res.session.currentUser = req.body.name; res.send('You\'re logged in '+ req.body.name + ' Be kind.'); }); res.redirect('/home'); }); }); ///render home page once logged in app.get('/home', function (req, res){ res.render('home'); }); //////register form app.get('/register', function (req, res){ res.render('register'); }); 

花了一大堆时间试图弄清楚为什么我得到错误,我把它移回到服务器文件。 但我仍然有错误。 所以我删除了users_controller.js文件(使控制器文件夹再次变空),并且一切都重新开始了! 所以,似乎我把文件放在控制器文件夹,即使是一个空文件,我的代码中断。 嗯。

我的猜测是,因为FS是告诉我的服务器在控制器文件夹中查找它的路由,只要没有文件在那里,它会回头看server.js路由。 但是,如果有的话,它首先看起来(这是正确的逻辑?)。 有了这个说法,我有几个问题:

1)为什么当我把这些路线放在“看起来”像适当的地方,控制器文件夹内的控制器文件? 毕竟,控制器文件夹是路由应该从哪里来的,对吧?

一旦这一切都解决了…

2)最佳实践:我认为这些表格正在与用户打交道,所以我会把它们放在用户控制器中 – 但是做一个forms_controller.js会更好吗?

所有的input赞赏;)

我的文件名(forms_controller.js)中有一个下划线是抛出错误。