2016-12-01 12 views
0

私は、実生活のイベントを登録して表示するロギングアプリケーションを構築しています。 すべてのデータは、角度2で動作するフロントエンドアプリケーションに入力され、このAPIを使用して情報を取得します。MissingSchemaError:モデル "User"にスキーマが登録されていません。 Mongoose populate issue

私の/ api/eventルートにアクセスしようとするたびに、次のエラーが表示されます。

C:\Users\<UserName>\sites\daily-report\backend\node_modules\mongoose\lib\connection.js:778 
throw new MongooseError.MissingSchemaError(name); 
^ 
MissingSchemaError: Schema hasn't been registered for model "User". 
Use mongoose.model(name, schema) 
    at NativeConnection.Connection.model (C:\Users\<UserName>\sites\daily-report\backend\node_modules\mongoose\lib\connection.js:778:11) 
    at getModelsMapForPopulate (C:\Users\<UserName>\sites\daily-report\backend\node_modules\mongoose\lib\model.js:3024:18) 
    at populate (C:\Users\<UserName>\sites\daily-report\backend\node_modules\mongoose\lib\model.js:2647:15) 
    at _populate (C:\Users\<UserName>\sites\daily-report\backend\node_modules\mongoose\lib\model.js:2615:5) 
    at Function.Model.populate (C:\Users\<UserName>\sites\daily-report\backend\node_modules\mongoose\lib\model.js:2575:5) 
    at Immediate.cb (C:\Users\<UserName>\sites\daily-report\backend\node_modules\mongoose\lib\query.js:1103:17) 
    at Immediate.<anonymous> (C:\Users\<UserName>\sites\daily-report\backend\node_modules\mquery\lib\utils.js:137:16) 
    at runCallback (timers.js:637:20) 
    at tryOnImmediate (timers.js:610:5) 
    at processImmediate [as _immediateCallback] (timers.js:582:5) 

誰かが私の問題で私を指摘できますか?私はこの問題を盲目的に見つめ始めている。

マイフォルダ構造は以下の通りである:このファイル内のルートを訪問するとき

|-app 
|---models 
|-----event.js 
|-----user.js 
|-config 
|---database.js 
|---passport.js 
|-routes 
|---event.js 
|---user.js 
|-server.js 

./routes/event.js エラーが(最初の1)をたまたま私は.populateを追加するまで すべてが正常に動作します( 'insertPerson')

var express  = require('express') 
var router  = express.Router() 
var User  = require('../app/models/user'); 
var Event  = require('../app/models/event'); 


//I get issues using this route 
router.get('/',function(req,res){ 
    User.auth(req,res,function(user){ 
     //something to do with the line below 
     Event.find().limit(10).sort('-updatedAt').populate('insertPerson').exec(function(err,theEvents){ 
      if(err){ 
       return res.json({success: false, msg: 'error'}); 
      } 
      res.json({success: true, events: theEvents}); 
     }) 
    }); 
}); 

router.post('/', function(req,res){ 
    console.log(req); 
    User.auth(req,res,function(user){ 
     var e = new Event({ 
      title: req.body.title, 
      description: req.body.description, 
      priority: req.body.priority, 
      insertPerson: user 
     }) 
     e.save(function(err) { 
      console.log(err) 
      if (err) { 
       return res.json({success: false, msg: 'error'}); 
      } 
      res.json({success: true, msg: 'Successful created new event.', event: e}); 
     }); 
    }); 
}); 

module.exports = router; 

./routes/user.js

Event.find()ラインに
var express  = require('express') 
    var router  = express.Router() 
    var User  = require('../app/models/user'); 
    var config  = require('../config/database'); // get db config file 
    var jwt   = require('jwt-simple'); 

    router.post('/signup', function(req, res) { 
     console.log('signup HIT!') 
    if (!req.body.email || !req.body.password || !req.body.firstName || !req.body.lastName) { 
     res.json({success: false, msg: 'Please pass name and password.'}); 
    } else { 
     var newUser = new User({ 
     email: req.body.email, 
     password: req.body.password, 
     firstName: req.body.firstName, 
     lastName: req.body.lastName 
     }); 
     // save the user 
     console.log(newUser); 
     newUser.save(function(err) { 
      console.log('fired') 
      console.log(err) 
     if (err) { 
      return res.json({success: false, msg: 'Email already exists.'}); 
     } 
     res.json({success: true, msg: 'Successful created new user.'}); 
     }); 
    } 
    }); 

    router.post('/authenticate', function(req, res) { 
    User.findOne({ 
     email: req.body.email 
    }, function(err, user) { 
     if (err) throw err; 

     if (!user) { 
     res.send({success: false, msg: 'Authentication failed. User not found.'}); 
     } else { 
     // check if password matches 
     user.comparePassword(req.body.password, function (err, isMatch) { 
      if (isMatch && !err) { 
      // if user is found and password is right create a token 
      var token = jwt.encode(user, config.secret); 
      // return the information including token as JSON 
      res.json({success: true, token: 'JWT ' + token, userObj: user}); 
      } else { 
      res.send({success: false, msg: 'Authentication failed. Wrong password.'}); 
      } 
     }); 
     } 
    }); 
    }); 

    router.get('/memberinfo', function(req,res){ 
     User.auth(req,res,function(user){ 
      res.json({success: true, path: "GET api/users/memberinfo", userObj: user}); 
     }) 
    }); 

    module.exports = router; 

./app/models/event.js

var mongoose  = require('mongoose'); 
var Schema   = mongoose.Schema; 
var autoIncrement = require('mongoose-auto-increment'); 
var User   = require('./user') 

var EventSchema = new Schema({ 
    title: { type: String, required: true }, 
    description: { type: String, required: true }, 
    priority: { type: Number, require: true, default: 0 }, 
    insertPerson: {type: mongoose.Schema.Types.ObjectId, ref: 'User'}, 
    updatePerson: {type: mongoose.Schema.Types.ObjectId, ref: 'User'}, 
    index: { type: Number, default: 0 } 
},{ timestamps: true }); 

EventSchema.plugin(autoIncrement.plugin, 'Event'); 
module.exports = mongoose.model('Event', EventSchema); 

./app/models/user.js

var mongoose = require('mongoose'), 
    Schema = mongoose.Schema, 
    autoIncrement = require('mongoose-auto-increment'); 
var bcrypt   = require('bcryptjs'); 
var jwt    = require('jwt-simple'); 
var config   = require('../../config/database'); // get db config file 

var connection = mongoose.createConnection(config.database); 

autoIncrement.initialize(connection); 

// Thanks to http://blog.matoski.com/articles/jwt-express-node-mongoose/ 

// set up a mongoose model 
var UserSchema = new Schema({ 
    email: { 
     type: String, 
     unique: true, 
     required: true 
    }, 
    password: { 
     type: String, 
     required: true 
    }, 
    firstName: { 
     type: String, 
     require: true 
    }, 
    lastName: { 
     type: String, 
     require: true 
    }, 
    accessLevel: { 
     type: Number, 
     default: 1000 
    } 
},{ timestamps: true }); 

UserSchema.pre('save', function (next) { 
    var user = this; 
    if (this.isModified('password') || this.isNew) { 
     bcrypt.genSalt(10, function (err, salt) { 
      if (err) { 
       return next(err); 
      } 
      bcrypt.hash(user.password, salt, function (err, hash) { 
       if (err) { 
        return next(err); 
       } 
       user.password = hash; 
       next(); 
      }); 
     }); 
    } else { 
     return next(); 
    } 
}); 

UserSchema.methods.comparePassword = function (passw, cb) { 
    bcrypt.compare(passw, this.password, function (err, isMatch) { 
     if (err) { 
      return cb(err); 
     } 
     cb(null, isMatch); 
    }); 
}; 

UserSchema.statics.auth = function(req, res, cb, debug=false){ 
    var token = getToken(req.headers); 
    if (token) { 
    var decoded = jwt.decode(token, config.secret); 
    this.findOne({ 
     email: decoded.email 
    }, function(err, user) { 
     if (err) throw err; 

     if (!user) { 
      return res.status(403).send({success: false, msg: 'Authentication failed. User not found.'}); 
     } else { 
      cb(user); 
     } 
    }); 
    } else { 
    return res.status(403).send({success: false, msg: 'No token provided.'}); 
    } 
}; 

getToken = function (headers) { 
    if (headers && headers.authorization) { 
    var parted = headers.authorization.split(' '); 
    if (parted.length === 2) { 
     return parted[1]; 
    } else { 
     return null; 
    } 
    } else { 
    return null; 
    } 
}; 
UserSchema.plugin(autoIncrement.plugin, 'User'); 
module.exports = connection.model('User', UserSchema); 

EDIT 添加server.js

./server.js

var express  = require('express'); 
    var app   = express(); 
    var bodyParser = require('body-parser'); 
    var morgan  = require('morgan'); 
    require('./app/models/user'); 
    require('./app/models/event'); 
    var mongoose = require('mongoose'); 
    var autoIncrement = require('mongoose-auto-increment'); 
    mongoose.Promise = global.Promise; 
    var passport = require('passport'); 
    var config  = require('./config/database'); // get db config file 
    var User  = require('./app/models/user'); // get the mongoose model 

    var port  = process.env.PORT || 8080; 
    var jwt   = require('jwt-simple'); 
    require('./config/passport')(passport); 
    var userRoutes = require('./routes/user'); 
    var categoriesRoutes = require('./routes/categories') 
    var eventRoutes = require('./routes/event') 



    // get our request parameters 
    app.use(bodyParser.urlencoded({ extended: false })); 
    app.use(bodyParser.json()); 

    // log to console 
    app.use(morgan('dev')); 
    var connection = mongoose.connect(config.database) 
    autoIncrement.initialize(connection) 

    // Use the passport package in our application 
    app.use(passport.initialize()); 

    // demo Route (GET http://localhost:8080) 
    app.get('/', function(req, res) { 
    res.send('Hello! The API is at http://localhost:' + port + '/api'); 
    }); 

    app.use('/api/users', userRoutes); 
    app.use('/api/categories', categoriesRoutes); 
    app.use('/api/event', eventRoutes); 

    // Start the server 
    app.listen(port); 
    console.log('There will be dragons: http://localhost:' + port); 

多くの感謝!

+0

スキーマを定義したばかりです。あなたのスキーマをどこでモデルにコンパイルしていますか? –

答えて

0

スキーマを定義したばかりです。あなたのスキーマをどこでモデルにコンパイルしていますか?

マングースでは、すべてがスキーマから派生しています。

例:私たちは、文字列になりますつのプロパティ、名前のスキーマを、持っている

var someSchema = mongoose.Schema({ 
    name: String 
}); 

。次のステップは、スキーマをモデルにコンパイルすることです。

var randomDoc = mongoose.model('randomDoc', someSchema); 

モデルはドキュメントを構成するクラスです。この場合、各ドキュメントは、私たちのスキーマで宣言されたプロパティと振る舞いを持つrandomDocになります。

この部分は欠けています。

+1

お返事ありがとうございます。私は実際に 'module.exports = mongoose.model( 'Event'、EventSchema);というモデルをエクスポートします。' ./app/models/event.jsと./app/models/user.jsを参照してください。 – Thyvo

関連する問題