MEANアプリを作成しています。
これは私のユーザー名スキーマです。ユーザー名は一意である必要があります。
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
module.exports = mongoose.model('User', new Schema({
username: { type: String, unique: true }
}));
私のポストルートでは、このようにユーザーを保存します:
app.post('/authenticate', function(req, res) {
var user = new User({
username: req.body.username
});
user.save(function(err) {
if (err) throw err;
res.json({
success: true
});
});
})
同じユーザー名で再度投稿すると、次のエラーが発生します。
MongoError:insertDocument ::原因::: 11000 E11000重複キーエラーインデックス:
エラーの代わりに{ succes: false, message: 'User already exist!' }
のようなjsonを送信する方法を誰かが説明できますか
注:ユーザーを投稿した後、自動的に認証されます。パスワードなどは必要ありません。
Saveメソッドから返されたエラーをテストして、重複したユーザー名に対してエラーがスローされたかどうかを確認する必要があります。
app.post('/authenticate', function(req, res) {
var user = new User({
username: req.body.username
});
user.save(function(err) {
if (err) {
if (err.name === 'MongoError' && err.code === 11000) {
// Duplicate username
return res.status(422).send({ succes: false, message: 'User already exist!' });
}
// Some other error
return res.status(422).send(err);
}
res.json({
success: true
});
});
})
この素敵なパッケージmongoose-unique-validatorを試すこともできます。これにより、エラー処理がはるかに簡単になります。 MongoDBからのE11000エラーではなく、一意の制約に違反しようとすると、Mongoose検証エラーが発生します。
var mongoose = require('mongoose');
var uniqueValidator = require('mongoose-unique-validator');
// Define your schema as normal.
var userSchema = mongoose.Schema({
username: { type: String, required: true, unique: true }
});
// You can pass through a custom error message as part of the optional options argument:
userSchema.plugin(uniqueValidator, { message: '{PATH} already exists!' });
これを試して:
app.post('/authenticate', function(req, res) {
var user = new User({
username: req.body.username
});
user.save(function(err) {
if (err) {
// you could avoid http status if you want. I put error 500
return res.status(500).send({
success: false,
message: 'User already exist!'
});
}
res.json({
success: true
});
});
})