2015-07-18 18 views
1

我使用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文件(使控制器文件夾再次變空),並且所有的工作都重新開始了!所以看起來我把文件放在控制器文件夾中的一分鐘,即使是一個空文件,我的代碼也會中斷。嗯。

我的猜測是,由於fs告訴我的服務器在控制器文件夾中查找它的路由,只要沒有文件在那裏,它就會回頭查看server.js的路由。但是,如果有的話,它首先看起來(這是正確的邏輯?)。有了這個說法,我有幾個問題:

1)爲什麼當我把這些路線放在什麼'看起來'似乎恰當的地方,控制器文件夾內的控制器文件?畢竟,控制器文件夾是路由應該來自哪裏,對吧?

一旦這一切都整理出來......

2)最佳實踐:我想通了形式正在處理的用戶,所以我將它們放在用戶控制器 - 但它會是更好的做法做出forms_controller。 JS?

所有輸入被理解;)

+0

1)'./controllers/'+ file'的內容在發生require錯誤之後是什麼? 2)添加'console.log(route);'顯示'route'變量的值和調試。 –

+0

爲什麼在每個循環中聲明路由爲每個,聲明一次var路由;在頂部像其他人一樣休息然後嘗試。感謝stdob – sam100rav

+0

我會嘗試! – HolyMoly

回答

1

有在我的文件名(forms_controller.js),這是引發錯誤下劃線。

相關問題