【问题标题】:Code breaks once I start adding files to my controllers folder - why?一旦我开始将文件添加到我的控制器文件夹中,代码就会中断 - 为什么?
【发布时间】:2015-10-08 09:11:42
【问题描述】:

我正在使用 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 会更好吗?

感谢所有输入 ;)

【问题讨论】:

  • 1) ./controllers/' + file 的内容是什么,之后出现 require 错误? 2) 添加console.log(route);显示route变量的值并调试。
  • 为什么在for each的每个循环中都声明路由,声明一次var route;像其他人一样在顶部,然后尝试。
  • 感谢 stdob 我会尝试的!
  • 这是一个班级,他们教我们设置@sam100rav
  • 哦,回答你的第一个问题,内容是你看到的所有路线,除了第一个,因为它是回家路线

标签: node.js model-view-controller express fs


【解决方案1】:

我的文件名 (forms_controller.js) 中有一个下划线引发了错误。

【讨论】:

    猜你喜欢
    • 2012-05-30
    • 2017-04-27
    • 2014-07-31
    • 2021-11-09
    • 2019-09-08
    • 2015-01-23
    • 1970-01-01
    • 2014-12-10
    • 1970-01-01
    相关资源
    最近更新 更多