我收到重复键错误-MongoError:E11000重复键错误集合。我确实有2个收藏集,用户和个人资料。

时间:2018-08-09 10:48:54

标签: javascript node.js mongodb express mongoose

我正在尝试制作一个应该具有以下流程的项目。 注册->登录->个人资料创建->秘密页面 我已经实现了注册和登录路线,但是当我为个人资料页面保存数据时,它显示了以上错误。我只能第一次保存数据。我也无法为其他用户保存数据。谢谢。

// This is the route which i am including.

    var express                 = require('express');
    var router                     = express.Router();
    var passport                 = require('passport');
    var multer                     = require('multer');
    var mongoose                 = require('mongoose');
    var User                     = require('../models/user.model.js');
    var Profile                 = require('../models/profile.model.js');
    var path                     = require('path');

// Defining the storage path to the multer    
    var storage = multer.diskStorage({
    destination : 'uploads/',
    filename: function(req, file, cb){
    cb(null, file.filedname + '-' +Date.now() + path.extname(file.originalname));
    },
    fileFilter: function(file, cb){
    checkFileType(file, cb);
    }
    });

// 
    var upload = multer({
    storage: storage
    });


//The signup route to post the username and password and register in the database
    router.post('/signup', function(req, res){
    req.body.username
    req.body.password
    User.register(new User({username : req.body.username}), req.body.password, function(err, user){
    if (err) {
    console.log(err);
    return res.render('signup.ejs');
    } 
    passport.authenticate('local')(req, res, function(){
    res.render('profile.ejs');
    });
    });
    });


// The login route to post the username and password and login into the portal
    router.post('/login', passport.authenticate('local', {
    successRedirect : '/secret',
    failureRedirect : '/login'
    }), function (req, res) {

// body...
// console.log("Login Working");
    });

// The profile route to render the profile page only if logged in
    router.get('/profile', isLoggedIn, function(req, res){
    res.render('profile.ejs')
    });

// The profile route. This route is generating error        
    router.post('/profile', upload.any(), function(req, res){
    console.log(req.body);
    var profileDetails = {};
    profileDetails.path = req.files[0].path;
    profileDetails.originalname = req.files[0].originalname;
    profileDetails.name = req.body.profileName;
    profileDetails.email = req.body.profileEmail;
    Profile.create(profileDetails, function(err){
    if (err) {
    console.log(err);
    }
    res.redirect('/missing');
    });
    });

    router.get('/missing', isLoggedIn, function (req, res) {
// body...
    res.render('missing.ejs')
    })

//The function to check is user is logged in or not
    function isLoggedIn(req, res, next){
    if (req.isAuthenticated()) {
    return next();
    }
    res.redirect('/login');
    }

    module.exports = router;

1 个答案:

答案 0 :(得分:0)

您收到的错误消息是说已经有一个用户名,其值为null。这意味着已经有一个没有用户名的用户,而您正在尝试添加另一个用户。

Mongo文档针对这些情况陈述以下内容:

  

如果文档在唯一索引中没有索引字段的值,则索引将为此文档存储一个空值。由于存在独特的约束,MongoDB将只允许一个缺少索引字段的文档。如果有多个文档的索引字段没有值或缺少索引字段,则索引构建将失败,并出现重复的键错误。

     

您可以将唯一约束与稀疏索引结合使用以进行过滤   唯一索引中的这些空值,避免出现错误。

要么在注册用户时需要验证是否有真实的用户名,要么需要向集合中添加sparse index。 (这允许您输入多个具有空值的条目,但只会返回具有适当值的条目。)