私は、実生活のイベントを登録して表示するロギングアプリケーションを構築しています。 すべてのデータは、角度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);
多くの感謝!
スキーマを定義したばかりです。あなたのスキーマをどこでモデルにコンパイルしていますか? –