我正在构建一个记录应用程序来注册和显示真实生活事件。 所有数据都输入到运行角度为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);
非常感谢!
答案 0 :(得分:0)
您刚刚定义了一个架构。你在哪里将模式编译成模型?
使用Mongoose,一切都来自Schema。
示例:
var someSchema = mongoose.Schema({
name: String
});
我们有一个带有一个属性name的模式,它将是一个String。下一步是将我们的模式编译为模型。
var randomDoc = mongoose.model('randomDoc', someSchema);
模型是用于构造文档的类。在这种情况下,每个文档都是randomDoc,其属性和行为在我们的模式中声明。
您缺少此部分。