一旦我开始将文件添加到我的控制器文件夹,代码就会中断 - 为什么?
Code breaks once I start adding files to my controllers folder - why?
我正在使用 node、express、fs 和其他一些东西来创建我的第一个 MVC 框架应用程序。我目前正在谷歌搜索以查找有关我遇到的错误的更多信息,但没有找到我正在寻找的清晰度。现在,当我将所有代码保存在 server.js 文件中时,我不会收到错误。但这不是 MVC 的全部内容,所以在某个时候我创建了一个 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 文件(使 controllers 文件夹再次为空),一切又恢复正常了!所以似乎在我将文件放入控制器文件夹的那一刻,即使是一个空文件,我的代码也会中断。嗯嗯
我猜是因为 fs 告诉我的服务器在 controllers 文件夹中查找它的路由,只要那里没有文件,它就会回头到 server.js 查找路由。但如果有,它会先看那里(这是正确的逻辑吗?)。话虽如此,我有几个问题:
1) 当我将这些路由放在适当的地方 'seems' 时,为什么它会中断,控制器文件夹中的控制器文件?毕竟,控制器文件夹应该是路由的来源,对吧?
一旦一切都解决了...
2) 最佳实践:我认为表单是与用户打交道的,所以我会把它们放在用户控制器中——但是做一个 forms_controller.js 会更好吗?
感谢所有意见 ;)
我的文件名 (forms_controller.js) 中有一条下划线引发了错误。
我正在使用 node、express、fs 和其他一些东西来创建我的第一个 MVC 框架应用程序。我目前正在谷歌搜索以查找有关我遇到的错误的更多信息,但没有找到我正在寻找的清晰度。现在,当我将所有代码保存在 server.js 文件中时,我不会收到错误。但这不是 MVC 的全部内容,所以在某个时候我创建了一个 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 文件(使 controllers 文件夹再次为空),一切又恢复正常了!所以似乎在我将文件放入控制器文件夹的那一刻,即使是一个空文件,我的代码也会中断。嗯嗯
我猜是因为 fs 告诉我的服务器在 controllers 文件夹中查找它的路由,只要那里没有文件,它就会回头到 server.js 查找路由。但如果有,它会先看那里(这是正确的逻辑吗?)。话虽如此,我有几个问题:
1) 当我将这些路由放在适当的地方 'seems' 时,为什么它会中断,控制器文件夹中的控制器文件?毕竟,控制器文件夹应该是路由的来源,对吧?
一旦一切都解决了...
2) 最佳实践:我认为表单是与用户打交道的,所以我会把它们放在用户控制器中——但是做一个 forms_controller.js 会更好吗?
感谢所有意见 ;)
我的文件名 (forms_controller.js) 中有一条下划线引发了错误。