【问题标题】:[Mongoose]How can I use the same model twice with two different schemas within app.js[Mongoose]如何在 app.js 中使用两个不同的模式两次使用相同的模型
【发布时间】:2014-09-22 05:53:45
【问题描述】:

我正在尝试访问相同的数据库/模型以进行注册和登录功能,但每次我尝试运行我的节点应用程序时都会收到此错误消息“编译后无法覆盖‘用户’模型”这是我的代码:

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

【问题讨论】:

  • 这有什么意义,因为您可以使用相同的架构查找用户名和密码。
  • 对不起,我不知道这一点,你能帮帮我吗,你能给我一个例子吗?谢谢你告诉我:D

标签: node.js express mongoose passport.js


【解决方案1】:

您仍然可以使用相同的架构进行查找。

架构

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;

在回调之前。

【讨论】:

  • 由于某种原因,它仍然无法正常工作,我已经单独测试了身份验证脚本,并且可以正常工作。我不确定为什么它在实际应用中不起作用,你有什么想法吗?
  • 我设置了一个认证成功和认证失败的回调函数,我返回了一个失败的认证。 app.post('/login', passport.authenticate('local', { successRedirect: '/loginSuccess', failureRedirect: '/loginFailure' }) ); app.get('/loginFailure', function(req, res, next) { res.send('验证失败'); }); app.get('/loginSuccess', function(req, res, next) { res.send('Successfully authenticated'); });
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-17
  • 2018-01-14
  • 1970-01-01
  • 2017-11-16
  • 1970-01-01
  • 2014-03-23
  • 1970-01-01
相关资源
最近更新 更多