[Mongoose]如何在 app.js 中使用两个不同的模式两次使用相同的模型

Posted

技术标签:

【中文标题】[Mongoose]如何在 app.js 中使用两个不同的模式两次使用相同的模型【英文标题】:[Mongoose]How can I use the same model twice with two different schemas within 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 【参考方案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'); );

以上是关于[Mongoose]如何在 app.js 中使用两个不同的模式两次使用相同的模型的主要内容,如果未能解决你的问题,请参考以下文章

如何让 node.js 使用 mongoose 连接到 mongolab

如何使用 Mongoose 使用 MongoDB 事务?

运行 app.js 时出现 Nodejs-mongoose-0.0.5 错误

运行 app.js 时出现 Nodejs-mongoose-0.0.5 错误

javascript app.js mongoose数据库设置

如何解决 Mongoose Connect UNKNOWN?