2016-12-08 2 views
0

я получаю некоторые проблемы с моим приложением прямо сейчас ...MissingSchemaError: Схема не была зарегистрирована для модели «неопределенном»

так это мой models.js:

var mongoose = require('mongoose'); 

var User = new mongoose.Schema({ 
    username: String, 
    password: String, 
    created_at: {type: Date, default: Date.now} 
}); 

var Beep = new mongoose.Schema({ 
    created_by: { type: Schema.ObjectId, ref: 'User' }, 
    created_at: { type: Date, default: Date.now}, 
    text: String 
}); 


//declaration of models with respective schemas 
module.exports = mongoose.model('User', User); 
module.exports = mongoose.model('Beep', Beep); 

I использую паспорт для части аутентификации и ниже является частью моего паспорта-init.js

var mongoose = require('mongoose'); 
var User = mongoose.model(User); 
var LocalStrategy = require('passport-local').Strategy; 
var bCrypt = require('bcrypt-nodejs'); 


module.exports = function(passport){ 

    passport.serializeUser(function(user, result) { 
     console.log('serializing user:', user._id); 
     //return the unique id for the user (the default id provided by mongoDB) 
     return result(null, user._id); 
    }); 


    passport.deserializeUser(function(username, result) { 

     User.findById(id, function(err, user){ 

      //in case there's a mongoDB error 
      if (err){ 
       return result (err, false); 
      } 
      //If no user with this username is found 
      if (!user){ 
       return result('user '+ username + 'not found', false); 
      } 
      return result(null,user); 
     }); 

теперь app.js:

var express = require('express'); 
var path = require('path'); 
var favicon = require('serve-favicon'); 
var logger = require('morgan'); 
var cookieParser = require('cookie-parser'); 
var bodyParser = require('body-parser'); 
var passport = require('passport'); 
var session = require('express-session'); 
var mongoose = require('mongoose'); 
// Initialize models 
require('./models/models'); 
//connection to mongoDB database 
mongoose.connect("mongodb://localhost:27017/bipperDB"); 

var api = require('./routes/api'); 
var authenticate = require('./routes/authenticate')(passport); 

var app = express(); 

// view engine setup 
app.set('views', path.join(__dirname, 'views')); 
app.set('view engine', 'ejs'); 

// uncomment after placing your favicon in /public 
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico'))); 
app.use(logger('dev')); 
app.use(session({ 
    secret: 'super secret' 
})); 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ extended: false })); 
app.use(cookieParser()); 
app.use(express.static(path.join(__dirname, 'public'))); 
app.use (passport.initialize()); 
app.use (passport.session()); 

// Initialize Passport 
var initPassport = require('./passport-init'); 
initPassport(passport); 

app.use('/api', api); 
app.use('/auth', authenticate); 

// catch 404 and forward to error handler 
app.use(function(req, res, next) { 
    var err = new Error('Not Found'); 
    err.status = 404; 
    next(err); 
}); 

// error handler 
app.use(function(err, req, res, next) { 
    // set locals, only providing error in development 
    res.locals.message = err.message; 
    res.locals.error = req.app.get('env') === 'development' ? err : {}; 

    // render the error page 
    res.status(err.status || 500); 
    res.render('error'); 
}); 

module.exports = app; 

И я получаю эту ошибку:

throw new mongoose.Error.MissingSchemaError(name); 
    ^
MissingSchemaError: Schema hasn't been registered for model "undefined". 
Use mongoose.model(name, schema) 
    at Mongoose.model (C:\wamp64\www\Bipper\node_modules\mongoose\lib\index.js:362:13) 
    at Object.<anonymous> (C:\wamp64\www\Bipper\passport-init.js:5:21) 
+0

сделано, но теперь он говорит: Ошибка: Не удается найти модуль «User» –

+0

ооо вам просто нужно дать вашей модели путь к файлу, где вы определили схему – abdulbarik

+0

вы можете быть более конкретный, пожалуйста? Я не понял тебя, я немного истощен на самом деле. –

ответ

0

When exporting multiple models from a single file like you are in models.js, you need to give each exported model its own exports field name.

Изменить файл models.js как этот

var mongoose = require('mongoose'); 

var User = new mongoose.Schema({ 
    username: String, 
    password: String, 
    created_at: {type: Date, default: Date.now} 
}); 

var Beep = new mongoose.Schema({ 
    created_by: { type: Schema.ObjectId, ref: 'User' }, 
    created_at: { type: Date, default: Date.now}, 
    text: String 
}); 


//declaration of models with respective schemas 
var User = mongoose.model('User', User); 
var Beep = mongoose.model('Beep', Beep); 

module.exports={ 
User:User, 
Beep:Beep 
} 

Теперь требуют вашего файла модели, как этот

var model=require('path of your modelsfile/models'); 

затем использовать как

model.User or model.Beep 

Надежда, которая поможет вам

+0

хорошо, он работает !! -Просто маленькая деталь: мне пришлось добавить var Schema = mongoose.Schema; в моих models.js Но можете ли вы на самом деле объяснить мне, почему он не работал с моей предыдущей работой? EDIT: было ли это потому, что синтаксисом был какой-то «старый узел/экспресс-синтакс»? –

+0

При экспорте нескольких моделей из одного файла, например, в 'models.js', вам нужно предоставить каждой экспортируемой модели свое собственное имя поля экспорта. – abdulbarik

+1

Получил это, в следующий раз я буду следить за этим или просто работать с одним файлом для каждой модели. Благодарю вас за ваше время. –

Смежные вопросы