14

我使用 mongoose 和 express 3 创建了一个注册表单

用户可能已经使用该用户名存在,在这种情况下我得到一个 err.code 11000 (重复键)。我应该如何处理现有用户?

这就是我现在正在做的......但我不确定检查错误代码是最好的方法:

  user.save(function(err){
    if ( err ) {
      console.log(err);
      console.log(err.code);

      //duplicate key
      if ( err.code == 11000 ) {
        req.flash('error', 'User already exists');
        res.redirect('/signup');
        return;
      }
    }

    res.locals.user = user;
    req.session.user = user;
    //res.locals.session = req.session;
    res.redirect('/');
  });

有没有更好的方法来做到这一点?

4

4 回答 4

22

试试这个:

user.save(function(err){
  if ( err && err.code !== 11000 ) {
    console.log(err);
    console.log(err.code);
    res.send('Another error showed up');
    return;
  }

  //duplicate key
  if ( err && err.code === 11000 ) {
    req.flash('error', 'User already exists');
    res.redirect('/signup');
    return;
  }

  res.locals.user = user;
  req.session.user = user;
  //res.locals.session = req.session;
  res.redirect('/');
});

您不会以这种方式填写错误日志。

于 2012-09-28T16:52:30.473 回答
5

我还没有尝试过,但这是我认为可以避免导致错误的方法:

//look for existing user first
user.findOne({ username: req.body.username }, function(err, user) {
  if ( err ) throw err;

  //existing user found, stop registration
  if ( user ) {
      res.flash('error', "That user already exists");
      res.redirect('/signup');
      return;
  }

  //create new user
  var user = new User({ username: req.body.username });

  user.save(function(err){
   if ( err ) throw err;
      res.flash('info', "Your account has been created");
      res.redirect('/account');
  });
});
于 2012-09-29T20:54:26.720 回答
0

使用逻辑方法的最简单方法

  1. 将自增值定义为唯一

someModal.js

var someschema = Schema({
    num: {type:Number,unique:true} // increment number 
});
var someModal = mongoose.model('someschema', someschema);

控制器.js

async function insertDoc(someModal, lastNumFromDb, newDocToSave) {

    try {
        let lastNumFromDb = await someModal.findOne().sort({ _id: -1 }).lean();
        newDocToSave.lastNumFromDb = lastNumFromDb + 1
        let saved = await new someModal(newDocToSave).save();
        return saved;
    } catch (err) {
        if (err.code === '11000') {
            return insertDoc(someModal, lastNumFromDb, newDocToSave)
        }else{
            throw err
        }
    }

}
于 2020-09-07T12:22:56.247 回答
0

如果您在 2021 年来到这里,我写了一篇关于此的文章。

您基本上通过执行 indexscan 在发生错误之前覆盖create或运行并解决错误。insertOne

于 2021-02-08T17:33:25.657 回答