在Express路径文件中创建用户时出错

时间:2013-08-18 05:59:52

标签: node.js express mongoose

我正在创建一个节点应用,我正在关注nodepad example来创建我的用户。但是,当我尝试打开我的/注册页面时,我正在尝试进行路由分离并遇到问题。

我的app.js文件看起来像这样:

var express = require('express'),
app = express(),
users = require('./routes/users'),
http = require('http'),
path = require('path'),
mongoose = require('mongoose'),
mongoStore = require('connect-mongodb'),
util = require('util'),
models = require('./models'),
db,
User,
LoginToken,
Settings = { development: {}, test: {}, production: {} };

/**
 * Environments
 */

app.configure('development', function() {
  db = 'mongodb://localhost/db-development';
  app.use(express.errorHandler({ dumpExceptions: true }));
  app.set('view options', {
    pretty: true
  });
});

app.configure('test', function() {
  db = 'mongodb://localhost/db-test';
  app.set('view options', {
    pretty: true
  });
});

app.configure('production', function() {
  db = 'mongodb://localhost/db-production';
});

console.log(db);

/**
 * Models Definitions
 */

models.defineModels(mongoose, function() {
  app.User = User = mongoose.model('User');
  app.LoginToken = LoginToken = mongoose.model('LoginToken');
});

mongoose.connect(db);

/**
 * All environments
 */

app.configure(function() {
  app.set('port', process.env.PORT || 3001);
  app.set('views', __dirname + '/views');
  app.set('view engine', 'jade');
  app.use(express.favicon());
  app.use(express.logger('dev'));
  app.use(express.bodyParser());
  app.use(express.cookieParser());
  app.use(express.session({ url: db, secret: 'secret' }));
});

...

// Sessions
app.post('/sessions', sessions.index);
app.get('/login', sessions.new);
app.del('/sessions', loadUser, sessions.del);

// Users

app.get('/register', users.register);
app.post('/users.:format?', users.registerprocess);
...

然后,我的死记硬背文件看起来像这样:

exports.register = function(req, res) {
  var user = new User();
  res.render('users/new.jade', { flash: req.flash(),
                                  title: 'Register',
                                  bodyClass: 'registration',
                                  user: user});
};

exports.registerprocess = function(req, res) {
  var user = new User(req.body.user);

  function userSaveFailed() {
    req.flash('error', 'Account creation failed');
    res.render('users/new.jade', { flash: req.flash(),
                                   title: 'Register',
                                   bodyClass: 'registration',
                                   user: user });
  }

  user.save(function(err) {
    if (err) return userSaveFailed();

    req.flash('info', 'Your account has been created');
    // emails.sendWelcome(user);

    switch (req.params.format) {
      case 'json':
        res.send(user.toObject());
      break;

      default:
        req.session.user_id = user.id;
        res.redirect('/');
    }
  });
};

当我尝试进入/注册时,我收到以下错误:

ReferenceError: User is not defined
at module.exports.register (/Users/mmellado/workspace/project/routes/users.js:2:18)
at callbacks (/Users/mmellado/workspace/project/node_modules/express/lib/router/index.js:161:37)
at param (/Users/mmellado/workspace/project/node_modules/express/lib/router/index.js:135:11)
at pass (/Users/mmellado/workspace/project/node_modules/express/lib/router/index.js:142:5)
at Router._dispatch (/Users/mmellado/workspace/project/node_modules/express/lib/router/index.js:170:5)
at Object.router (/Users/mmellado/workspace/project/node_modules/express/lib/router/index.js:33:10)
at next (/Users/mmellado/workspace/project/node_modules/express/node_modules/connect/lib/proto.js:190:15)
at Object.methodOverride [as handle] (/Users/mmellado/workspace/project/node_modules/express/node_modules/connect/lib/middleware/methodOverride.js:49:5)
at next (/Users/mmellado/workspace/project/node_modules/express/node_modules/connect/lib/proto.js:190:15)
at Object.logger (/Users/mmellado/workspace/project/node_modules/express/node_modules/connect/lib/middleware/logger.js:156:5)

这使我假设由于某种原因,路由文件中找不到用户架构。为什么会发生这种情况的任何想法?

2 个答案:

答案 0 :(得分:1)

您将用户放在app对象上,但您不需要在其他文件中使用它。我不确定你为什么选择在app.js中定义你的模型,你应该在他们自己的文件中定义它们,他们不应该知道你的app实例。然后在你的路线需要你的模型。通过将模型放置在应用程序实例上,您可以在不需要的时候创建紧耦合。

答案 1 :(得分:0)

未定义用户。 为什么你坚持用户应用程序是任何人的猜测,但你需要做的是在你的路由的js文件中有app。你可以在那里要求它。

编辑: 看着这个例子。在我的选择中它不是很好。它们可以更好地分离来自控制器的路径,并且以非常奇怪的方式导入猫鼬模型,您基本上必须将它们定义两次。它需要更加混乱。

他们的例子将是一个痛苦的延伸。我会发现自己的另一个例子。

(是的,我知道我在这里没什么帮助,但是它的230am以及我能给你的最好的建议就是远离这个垃圾,如果你刚开始使用node / mongoose / express)