web-dev-qa-db-fra.com

MongoError: collecte d'erreurs de clé en double E11000: index test.users: email1_1 clé dup: {email1: null}

chaque fois que j'essaie d'enregistrer un utilisateur, cela me donne cette erreur

J'ai vérifié la collection de bases de données et aucune entrée en double n'existe, faites-moi savoir ce que je fais mal?

FYI - req.body.email et req.body.password récupèrent des valeurs.

J'ai également vérifié cet article mais aucune aide STACK LINK

Si j'ai supprimé complètement, il insère le document, sinon il génère une erreur "Duplicate" même si j'ai une entrée dans le fichier local.email


    Server started on port 5000
    MongoDB Connected
    MongoError: E11000 duplicate key error collection: test.users index: email1_1 dup key: { email1: null }

     { driver: true,
      name: 'MongoError',
      index: 0,
      code: 11000,
      keyPattern: { email1: 1 },
      keyValue: { email1: null },
      errmsg: 'E11000 duplicate key error collection: test.users index: email1_1 dup key: { email1: null }',
      [Symbol(mongoErrorContextSymbol)]: {}
    }

Voici mon schéma utilisateur dans le schéma du modèle user.js


    const mongoose = require('mongoose');

    const UserSchema = new mongoose.Schema({
      name: {
        type: String,
        required: true
      },
      email: {type: String, unique: true, required: true
      },
      resetPasswordToken: String,
      resetPasswordExpires: Date,
      password: {
        type: String,
        required: true
      },
      date: {
        type: Date,
        default: Date.now
      }

    });

    const User = mongoose.model('User', UserSchema);

    module.exports = User;

Route


    const express = require('express');
    const router = express.Router();
    const bcrypt = require('bcryptjs');
    const passport = require('passport');
    const async = require("async");
    const nodemailer = require("nodemailer");
    const crypto = require("crypto");


    // Load User model
    const User = require('../models/User');
    const { forwardAuthenticated } = require('../config/auth');

    // Login Page
    router.get('/login', forwardAuthenticated, (req, res) => res.render('login'));


    // Register Page
    router.get('/register', forwardAuthenticated, (req, res) => res.render('register'));

    // Register
    router.post('/register', (req, res) => {
      const { name, email, password, password2 } = req.body;
      let errors = [];

      if (!name || !email || !password || !password2) {
        errors.Push({ msg: 'Please enter all fields' });
      }

      if (password != password2) {
        errors.Push({ msg: 'Passwords do not match' });
      }

      if (password.length < 6) {
        errors.Push({ msg: 'Password must be at least 6 characters' });
      }

      if (errors.length > 0) {
        res.render('register', {
          errors,
          name,
          email,
          password,
          password2
        });
      } else {
        User.findOne({ email: email }).then(user => {
          if (user) {
            errors.Push({ msg: 'Email already exists' });
            res.render('register', {
              errors,
              name,
              email,
              password,
              password2
            });
          } else {
            const newUser = new User({
              name,
              email,
              password
            });

            bcrypt.genSalt(10, (err, salt) => {
              bcrypt.hash(newUser.password, salt, (err, hash) => {
                if (err) throw err;
                newUser.password = hash;
                newUser
                  .save()
                  .then(user => {
                    req.flash(
                      'success_msg',
                      'You are now registered and can log in'
                    );
                    res.redirect('/users/login');
                  })
                  .catch(err => console.log(err));
              });
            });
          }
        });
      }
    });

    // Login
    router.post('/login', (req, res, next) => {
      passport.authenticate('local', {
        successRedirect: '/dashboard',
        failureRedirect: '/users/login',
        failureFlash: true
      })(req, res, next);
    });

    // Logout
    router.get('/logout', (req, res) => {
      req.logout();
      req.flash('success_msg', 'You are logged out');
      res.redirect('/users/login');
    });


    module.exports = router;

3
CodaBae

Le fait est que, comme je le vois dans le message d'erreur, il semble que vous ayez une entité dans la base de données qui n'a pas de courrier électronique (essentiellement email = null). Et parce que vous avez spécifié le champ d'e-mail comme nique, mongoDB pense que ne pas avoir d'e-mail est unique, donc il ne peut y avoir qu'une seule entité sans champ d'e-mail dans la collection. Et vous essayez d'ajouter une autre entité sans e-mail, et finalement, vous avez une erreur, car cette entité n'a également aucun e-mail comme enregistrement dans la base de données.

Il vous suffit de vérifier si le courrier électronique est présent, avant de l'envoyer à DB, ou d'implémenter une autre solution qui correspond à votre logique métier.

J'espère que ça aide :)

2
Max