javascript - Nodejs 应用程序抛出 E11000 重复键错误

标签 javascript node.js mongodb express

当我在网页上输入数据时,数据会正确同步到数据库。
但是当我尝试再次填写相同的表格时,它给出了错误:

{
    "code": 11000,
    "index": 0,
    "errmsg": "E11000 duplicate key error collection: test.creates index: aname_1 dup key: { : \"MicroSoft\" }",
    "op": {
        "aname":"MicroSoft",
        "pname":"Bing",
        "pusername":"Debtanu",
        "_id":"57c9486d690a35fc21794169",
        "__v":0
    }
}

从数据库中删除所有内容并再次尝试填写相同的表单后,它会获取该条目。
那么为什么它不将下一个条目输入到同一帐户表单中?

下面是我的 app.js 和 Account.jade 文件。

app.js:

var express = require('express');
 var favicon = require('serve-favicon');
 var path = require('path');
 var logger = require('morgan');
 var cookieParser = require('cookie-parser');
 bodyParser = require('body-parser');
 var session = require('express-session')
 var mongoose = require('mongoose');
 var nodemailer = require('nodemailer');
 var passport = require('passport');
 var LocalStrategy = require('passport-local').Strategy;
 var bcrypt = require('bcrypt-nodejs');
 var async = require('async');
 var crypto = require('crypto');
 var flash = require('express-flash');
 var router = express.Router();
 var fs = require('fs');


var createSchema = new mongoose.Schema({
    cname: {type: String, unique: true, sparse: true},
    aname : {type: String, unique: true, sparse: true},
    ausername : String,
    pname : {type: String, unique: true, sparse: true},
    pusername : String
});


var Create = mongoose.model('Create', createSchema);

mongoose.connect('localhost');

var app = express();


// Middleware
app.set('port', process.env.PORT || 3000);
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(cookieParser());
app.use(session({
    secret:'keyboard cat',
    // connect-mongo session store
    proxy: true,
    resave: true,
    saveUninitialized: true
}));
app.use(flash());
app.use(passport.initialize());
app.use(passport.session());
app.use(express.static(path.join(__dirname,'/public')));
app.use('/img',express.static(path.join(__dirname, 'public/images')));




app.get('/Account', function(req, res) {
    res.render('Account', {
        user: req.user 
    });
});

app.post('/Account', function(req,res,next){
    var create = new Create({
        cname: req.body.cname,
        aname: req.body.aname,
        ausername: req.body.ausername
    });

    create.save(function(err, doc){
        if(err) res.json(err)
        else res.redirect('/home');
    });
});

// Server
app.listen(app.get('port'), function() {
    console.log('Express server listening on port ' + app.get('port'));
});

module.exports = app;

account.jade 的格式不合适

最佳答案

由于您已将名称声明为架构中的唯一字段,因此您只能在数据库中保存唯一值。 cname 和 pusername 也是如此。

就您而言,当您第一次保存 Microsoft 时,它会保存文档。然而,当您下次尝试保存 MicroSoft 时,mongo 会抛出错误,因为数据库中已存在相同的值。

因此,作为解决方案,您应该删除唯一条件,或者只保存唯一值。

关于javascript - Nodejs 应用程序抛出 E11000 重复键错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39289925/

相关文章:

javascript - 定义插入的类型为String还是int

javascript - 如何按照 Mongoose.js 中的 _id 查找项目并处理它?

node.js - 定期应用程序在 Docker 容器中重新启动

mongodb - Azure Cosmos DB 的 MongoDB API 中的变更流支持有多可靠?

javascript - React PWA - 强制点击更新

javascript - "Run if I haven' t 在 x 秒内被调用”在 JavaScript 中

node.js - Husky 预提交 Hook 在提交后完成

java - mongodb 连接被对等方重置 : socket writer error

python - MongoEngine 模式 - 名称错误

javascript - 如何清除包含 gridview 行编辑值的 javascript 文本框