1

ノードアプリを作成しており、ノードパッドの例に従ってユーザーを作成しています。ただし、/register ページを開こうとすると、ルート分離を実行しようとして問題が発生します。

私の 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('/');
    }
  });
};

/register に移動しようとすると、次のエラーが表示されます。

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)

これは、何らかの理由で、ルート ファイルから User スキーマが見つからないことを前提としています。なぜこれが起こっているのかについて何か考えはありますか?

4

2 に答える 2

1

ユーザーをアプリオブジェクトに配置していますが、他のファイルでは必要ありません。app.js でモデルを定義することを選択する理由がわかりません。モデルを独自のファイルで定義する必要があり、アプリ インスタンスについて何も認識してはなりません。次に、ルートでモデルが必要です。モデルをアプリ インスタンスに配置することで、実際には必要のない密結合を作成しています。

于 2013-08-19T00:29:00.293 に答える