2017-10-13 11 views
0

Est-il possible de faire une recherche dans une recherche sur Node avec Mongoose? Je laisse un utilisateur changer son adresse e-mail, mais je dois m'assurer que l'e-mail n'a pas été utilisé par un autre utilisateur avant de sauvegarder le nouvel e-mail.Mongoose.js find() dans une find()

Je veux faire:

/************************************************************* 
* MY_USER - PROFILE UPDATE 
*************************************************************/ 
app.put('/api/myuser/info', auth, function(req, res) { 
    serverLog.log(req, production, {}); 

    // User ID 
    var myUserID = req.session.passport.user._id; 

    if (myUserID && validateID(myUserID)) { 

    User.findOne({ 
     _id: myUserID 
    }, function(err, data) { 
     if (err) throw err; 

     if (data == null) { 
      res.sendStatus(401); 
      console.log(401); 
     } 
     // Data 
     else { 

      // Update Email 
      if (req.body.email) { 

       // Check valid email 
       if (validateEmail(req.body.email)) { 
       console.log('validateEmail'); 

       // Check Unique Email 
       User.findOne({ 
        'local.user.info.email': email 
       }, function(err, user) { 

        if(err) return err; 

        if (user) { 
         // Email already in use 
         res.status(400).send('ERROR: Email Already in Use'); 
         return; 
        } 
        console.log('uniqueEmail ' + true); 
        // Update email 
        user.local.user.info.email = req.body.email; 
       }) 

       } 
       // Bad Email 
       else { 
       res.status(400).send('ERROR: Not a propper Email'); 
       return; 
       } 

      } 

      // SAVE USER DATA    
      if (info_sent) { 

       user.save(function(err, data) { 
       if (err) throw err; 

       res.setHeader('Content-Type', 'application/json'); 
       res.status(200).send(JSON.stringify(data.local.user.info, null, 3)); 
       return; 
       }); 
      } 
      // NO INFO WAS SENT 
      else { 
       res.status(400).send('ERROR: No information was sent.'); 
       return; 
      } 
     } 
    }); 
    } 
    // Bad/No User ID 
    else { 
    res.sendStatus(401); 
    } 
}); 

Je trouve l'utilisateur, puis vérifier si le courrier électronique est utilisé Comment peut-on s'y prendre?

+0

Alors comment ça se passe? Votre code a-t-il fonctionné? – msagala25

+0

Copie possible de [champ Mongoose & unique] (https://stackoverflow.com/questions/21971666/mongoose-unique-field) –

+0

Cela semble être un doublon: https://stackoverflow.com/questions/21971666/mongoose -unique-champ –

Répondre

0

Cela ne fonctionne pas car vous ne sauvegardez pas votre utilisateur dans la fonction de rappel qui vérifie si le courrier électronique existe déjà. Également envisager d'utiliser Promise pour éviter l'enfer de rappel

Quoi qu'il en soit, vous pouvez le faire comme ceci:

// Check Unique Email 
User.findOne({'local.user.info.email': email }, (err, user) => { 
    if (err) throw err; 
    if (user) { 
    return res.status(400).send('ERROR: Email Already in Use'); 
    } else { // SAVE USER DATA   
    if (info_sent) { 
    user.save((err, data) => { 
     if (err) throw err; 
     res.setHeader('Content-Type', 'application/json'); 
     return res.status(200).send(JSON.stringify(data.local.user.info, null, 3)); 
     }); 
    } else { 
     return res.status(400).send('ERROR: No information was sent.'); 
    } 
}