Node.js 如何修复和防止mongodb中的重复密钥错误

Node.js 如何修复和防止mongodb中的重复密钥错误,node.js,mongodb,c9.io,Node.js,Mongodb,C9.io,我最近一直在做一个爱好项目,我遇到了一个我似乎无法解决的问题,即使在上网寻找答案之后。我在c9.io上与MongoDB一起使用Node.js。每当我尝试在数据库中创建一个新条目时,第一个条目工作正常,但第二个条目会导致错误 E11000重复密钥错误集合:project.tasks索引:用户名\u 1重复密钥: {:null}' 我的模式: var mongoose = require("mongoose"); var passportLocalMongoose = require("passpo

我最近一直在做一个爱好项目,我遇到了一个我似乎无法解决的问题,即使在上网寻找答案之后。我在c9.io上与MongoDB一起使用Node.js。每当我尝试在数据库中创建一个新条目时,第一个条目工作正常,但第二个条目会导致错误

E11000重复密钥错误集合:project.tasks索引:用户名\u 1重复密钥: {:null}'

我的模式:

var mongoose = require("mongoose");
var passportLocalMongoose = require("passport-local-mongoose");

var taskSchema = new mongoose.Schema({
    task: String,
    region: String,
    cost: String,
    when: String,
    isAccepted: Boolean,
    author: {
        id:{
            type: mongoose.Schema.Types.ObjectId, 
            ref: "User"
        }
    },
    tasker: {
        id : { 
          type: mongoose.Schema.Types.ObjectId,
          ref: "User"
        }
    }
}); 

taskSchema.plugin(passportLocalMongoose);
module.exports = mongoose.model("Task", taskSchema);
app.post("/taskers/index/show", function(req, res){
   var task = req.body.task;
   var newTask = {
      task: task.task, 
      region: task.region, 
      cost: task.cost, 
      when: task.when, 
      isAccepted: false, 
      author: req.user._id, 
      tasker: req.user._id
   };
   console.log("STSOTSOTSOTOOPP");
   Task.create(newTask, function(err, newlyCreated){
      if(err){
         console.log(err);
      } else {
         console.log(newlyCreated);
         res.redirect("/users/index");
      }
   });
});
我的发帖请求:

var mongoose = require("mongoose");
var passportLocalMongoose = require("passport-local-mongoose");

var taskSchema = new mongoose.Schema({
    task: String,
    region: String,
    cost: String,
    when: String,
    isAccepted: Boolean,
    author: {
        id:{
            type: mongoose.Schema.Types.ObjectId, 
            ref: "User"
        }
    },
    tasker: {
        id : { 
          type: mongoose.Schema.Types.ObjectId,
          ref: "User"
        }
    }
}); 

taskSchema.plugin(passportLocalMongoose);
module.exports = mongoose.model("Task", taskSchema);
app.post("/taskers/index/show", function(req, res){
   var task = req.body.task;
   var newTask = {
      task: task.task, 
      region: task.region, 
      cost: task.cost, 
      when: task.when, 
      isAccepted: false, 
      author: req.user._id, 
      tasker: req.user._id
   };
   console.log("STSOTSOTSOTOOPP");
   Task.create(newTask, function(err, newlyCreated){
      if(err){
         console.log(err);
      } else {
         console.log(newlyCreated);
         res.redirect("/users/index");
      }
   });
});
如果有人知道我做错了什么,或者可以引导我找到解决方案,那将是令人惊讶的,因为我已经在这个问题上坚持了一段时间

E11000重复密钥错误集合:project.tasks索引:username\u 1 dup密钥:{:null}

此错误来自mongo(而不是mongoose)。从mongoose模式中删除索引不会对基础集合产生任何影响,因此您现在需要从
任务
集合中删除
用户名
上的唯一索引

这个索引很可能是由以前我们不再看到的代码创建的(或者可能是由
taskSchema.plugin(passportLocalMongoose);
——这听起来很可疑,就像是需要在
用户名上建立索引一样)

如果使用shell连接到mongo,则应该运行
db.tasks.getIndexes()
以查看唯一的用户名索引,然后使用删除有问题的索引


有关mongoose和mongo如何交互的更多详细信息,请参阅。

您在任务中有一个字段
用户名
?感谢您的帮助!!读了你所说的,我意识到我不需要passport local mongoose,因为它不是用户,然后我放弃了收集,并再次尝试,它工作了。非常感谢你!!