[Mongoose] Как я могу использовать ту же модель дважды с двумя разными схемами в App.js

StackOverflow https://stackoverflow.com//questions/25039376

Вопрос

Я пытаюсь получить доступ к одной и той же базе данных / модели для функции регистрации и входа в регистрацию, но каждый раз, когда я пытаюсь запустить приложение моего узла, я получаю это сообщение об ошибке «Не удается перезаписать модель пользователя после компиляции». Вот мой код:

//sign-up schema
var Schema = new mongoose.Schema({
  _id: String,
  name: String,
  username: String,
  password: String, 
  age: Number
});

var user = mongoose.model('users', Schema);

//sign-up login
app.post('/new', function(req, res) {
new user({
    _id: req.body.email,
    name: req.body.name,
    username: req.body.username,
    password: req.body.password,
    age: req.body.age

}).save(function(err, doc){
    if(err) res.json(err);
    else res.send('Successfully Signed up');
  });
});

//login schema
var Schema = mongoose.Schema;
var UserDetail = new Schema({
   username: String,
   password: String
}, {
   collection: 'users'
});
var UserDetails = mongoose.model('users', UserDetail);

//login logic
passport.use(new LocalStrategy(function(username, password, done) {
process.nextTick(function() {
UserDetails.findOne({
  'username': username, 
}, function(err, user) {
  if (err) {
    return done(err);
  }

  if (!user) {
    return done(null, false);
  }

  if (user.password != password) {
    return done(null, false);
  }

  return done(null, user);
  });
});
}));
.

Это было полезно?

Решение

Вы все еще можете использовать одну и ту же схему для поиска.

<Сильная> Схема

var Schema = new mongoose.Schema({
    _id: String,
    name: String,
    username: String,
    password: String,
    age: Number
});

var user = mongoose.model('users', Schema);
.

<Сильная> регистрация

app.post('/new', function(req, res) {
    new user({
        _id: req.body.email,
        name: req.body.name,
        username: req.body.username,
        password: req.body.password,
        age: req.body.age
    }).save(function(err, doc) {
        if (err) res.json(err);
        else res.send('Successfully Signed up');
    });
});
.

Войти

passport.use(new LocalStrategy(function(username, password, done) {
    process.nextTick(function() {
        user.findOne({
            'username': username
        }, function(err, user) {
            if (err) {
                return done(err);
            }

            if (!user) {
                return done(null, false);
            }

            if (user.password !== password) { 
                return done(null, false); 
            }

            return done(null, user);
        });
    });
}));
.

Если вы не хотите возвращать пароль в ответ, просто добавьте

delete user.password;
.

до обратного вызова.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top