mongodb mongoose中的重复键错误索引
Posted
技术标签:
【中文标题】mongodb mongoose中的重复键错误索引【英文标题】:duplicate key error index in mongodb mongoose 【发布时间】:2020-09-29 05:55:17 【问题描述】:我正在建立一个网站,在该网站中使用 Google 登录并输入电子邮件和密码工作正常,但是当我介绍使用 Facebook 登录时,mongoDb 出现以下错误-
MongoError: E11000 duplicate key error collection: userDB.users index: username_1 dup key: username: null
//jshint esversion:6
require('dotenv').config();
const express = require("express");
const bodyParser = require("body-parser");
const ejs= require("ejs");
const mongoose = require("mongoose");
const session = require("express-session");
const passport = require("passport");
const passportLocalMongoose = require("passport-local-mongoose");
const GoogleStrategy = require('passport-google-oauth20').Strategy;
const FacebookStrategy = require('passport-facebook').Strategy;
const findOrCreate = require("mongoose-findorcreate");
const app = express();
console.log(process.env.API_KEY);
app.use(express.static("public"));
app.set('view engine', 'ejs');
app.use(bodyParser.urlencoded(
extended: true
));
app.use(session(
secret: "Our little secret.",
resave: false,
saveIninitialized: false
));
app.use(passport.initialize());
app.use(passport.session());
mongoose.connect("mongodb://localhost:27017/userDB", useUnifiedTopology: true );
mongoose.set("useCreateIndex", true);
const userSchema = new mongoose.Schema (
email: String,
password: String,
googleId: String,
facebookId: String,
secret: String
);
userSchema.plugin(passportLocalMongoose);
userSchema.plugin(findOrCreate);
const User = new mongoose.model("User", userSchema);
passport.use(User.createStrategy());
passport.serializeUser(function(user, done)
done(null, user.id);
);
passport.deserializeUser(function(id, done)
User.findById(id, function(err, user)
done(err, user);
);
);
passport.use(new GoogleStrategy(
clientID: process.env.CLIENT_ID,
clientSecret: process.env.CLIENT_SECRET,
callbackURL: "http://localhost:3000/auth/google/secrets",
userProfileURL: "https://www.googleapis.com/oauth2/v3/userinfo"
,
function(accessToken, refreshToken, profile, cb)
User.findOrCreate( googleId: profile.id , function (err, user)
return cb(err, user);
);
));
passport.use(new FacebookStrategy(
clientID: process.env.FACEBOOK_APP_ID,
clientSecret: process.env.FACEBOOK_APP_SECRET,
callbackURL: "http://localhost:3000/auth/facebook/secrets"
,
function(accessToken, refreshToken, profile, cb)
User.findOrCreate( facebookId: profile.id , function (err, user)
return cb(err, user);
);
));
app.get("/",function(req,res)
res.render("home")
);
app.get('/auth/google',
passport.authenticate('google', scope: ['profile'] )
);
app.get('/auth/google/secrets',
passport.authenticate('google', failureRedirect: '/login' ),
function(req, res)
// Successful authentication, redirect to secrets.
res.redirect('/secrets');
);
app.get('/auth/facebook',
passport.authenticate('facebook'));
app.get('/auth/facebook/secrets',
passport.authenticate('facebook', failureRedirect: '/login' ),
function(req, res)
// Successful authentication, redirect home.
res.redirect('/secrets');
);
app.get("/login",function(req,res)
res.render("login")
);
app.get("/register",function(req,res)
res.render("register")
);
...
如何解决这个问题,以便我可以通过 google 和 facebook 一个接一个地登录,反之亦然?
【问题讨论】:
这能回答你的问题吗? E11000 duplicate key error index in mongodb mongoose SOF 上已经回答了很多类似的问题,请不要粘贴整个代码库(尝试只给我们您遇到此问题的部分/部分代码),尝试调试您的代码 - 这个是非常常见的问题,可以通过调试解决(错误本身是不言自明的)!! 不,这不能回答我的问题 看起来您在没有更新索引的情况下更改了架构。该错误消息表明字段username
上存在唯一索引,但您的架构定义不包含该字段。
你能告诉我如何解决这个问题,如何包含那个字段吗?
@namanmathur:您还需要帮助或解决吗?所以 User
模型连接到 userDB 中的 users
集合?
【参考方案1】:
在此处查看解决方案: Setting Up Facebook Authentication with MongoDB Atlas and Passport.js
问题出在上面的代码中,facebook 和 google 用户都在数据库中创建了一个没有用户名的文档。 MongoD 默认将用户名设置为唯一。所以只需从用户名中删除索引即可解决问题。
【讨论】:
以上是关于mongodb mongoose中的重复键错误索引的主要内容,如果未能解决你的问题,请参考以下文章
E11000 mongodb mongoose 中的重复键错误索引
E11000 mongodb mongoose 中的重复键错误索引
Mongoose - 由 :: 11000 E11000 重复键错误索引引起?
Mongoose - 由 :: 11000 E11000 重复键错误索引引起?