2016-09-02 2 views
1

ウェブページにデータを入力すると、データはデータベースに正しく同期されます。
しかし、私は再び同じフォームに入力しようとすると、それがエラーを与える:NodejsアプリでE11000重複キーエラーが発生する

{ 
    "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 
    } 
} 

DBからすべてのものを削除し、同じフォームを埋めるために再び試みた後、それはエントリを取ります。
それで、なぜ同じアカウントフォームに次の入力をしないのですか?

以下は、私の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はあなたがスキーマにユニークフィールドとしてANAMEを宣言しているので、あなたが唯一の一意の値を保存することができ、適切な形式で

+0

スキーマの作成は、アカウント変数を宣言するスキーマです。そして、私はnext()関数にいくつかの問題があると感じますが、それを正しく追加する方法はわかりません。 –

+0

あなたのapp.jsを、わかりやすいインデントで読み取り可能にフォーマットしてください。どのように表示する必要があるかを示すJSONエラーメッセージを出しました。たぶん、この質問に関連するセクションを投稿するだけです。 –

+1

いずれの場合でも、キーの重複エラーがあります。主キーがanameで、MicroSoftの値で2つのエントリを作成しようとしています。 –

答えて

0

ではありませんデータベース。これはcnameとpusernameで同じです。

あなたの場合、MicroSoftを初めて保存すると、ドキュメントが保存されます。一方、次回MicroSoftを保存しようとすると、mongoは同じ値がすでにデータベースに存在するため、エラーをスローします。

解決策として、一意の条件を削除するか、一意の値のみを保存する必要があります。

+0

1)Accountというページがあります。a)クラスタ名b)アカウント名c)ユーザー名。 2)プロジェクトと呼ばれる2番目のページがあり、次のような情報が得られます。a)アカウント名b)プロジェクト名c)ユーザー名今度は、アカウントやアカウントを形成するためのクラスタブレイクが、異なるプロジェクトにさらに壊れます。 [アカウント]ページでは、[クラスタ名]のようなデータを保存し、そのクラスタの下に新しいアカウントを保存する必要があります。次に、新しいプロジェクトを作成するには、プロジェクトが作成されるアカウント名と新しいプロジェクト名でプロジェクトフォームを入力する必要があります。これがフォーマットです。誰かがスキーマを修正するのに役立つことができます。 –

関連する問題