Question

I am trying to access the same database/model for a sign-up and sign-in function but everytime I try to run my node app I get this error message "cannot overwrite 'user' model once compiled" here's my code:

//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);
  });
});
}));
Was it helpful?

Solution

You can still use the same schema to lookup.

Schema

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

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

Registration

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

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);
        });
    });
}));

If you don't want to return the password in the response, just add

delete user.password;

before the callback.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top