MissingSchemaError:尚未为模型“User”注册Schema。猫鼬问题

时间:2016-12-01 19:25:54

标签: node.js mongodb express mongoose mongoose-populate

我正在构建一个记录应用程序来注册和显示真实生活事件。 所有数据都输入到运行角度为2的前端应用程序中,并使用此API获取信息。

每次尝试访问/ 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

./路由/ event.js 访问此文件中的路由时发生错误(第一个) 一切正常,直到我将.populate('insertPerson')添加到Event.find()行

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; 

./路由/ user.js的

  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;

./应用/模型/ 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);

./应用/模型/ 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);

修改 添加了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);

非常感谢!

1 个答案:

答案 0 :(得分:0)

您刚刚定义了一个架构。你在哪里将模式编译成模型?

使用Mongoose,一切都来自Schema。

示例:

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

我们有一个带有一个属性name的模式,它将是一个String。下一步是将我们的模式编译为模型。

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

模型是用于构造文档的类。在这种情况下,每个文档都是randomDoc,其属性和行为在我们的模式中声明。

您缺少此部分。