У меня есть модель под названием Application:Состояние проверки состояния Мангуста?
var ApplicationSchema = new mongoose.Schema({
name : {type: String, validate: [uniqueName, 'Unique Name']},
dateCreated: Date,
containers : [ContainerSchema]
});
mongoose.model('Application', ApplicationSchema);
var Application = database.model('Application');
Он вызывает функцию проверки под названием UniqueName, когда он экономит:
function uniqueName(name)
{
console.log('In Unique Name function');
Application.find({}, function(error, documents) {
for(var i = 0; i < documents.length; i++) {
if(documents[i].name == name) {
console.log('About to return false');
return false;
}
}
});
return true;
}
Позже в коде я положил некоторые данные в модели и сохранить его:
newApplication.name = request.body.name;
newApplication.save(function(error) {
console.log('Callback for save');
if(error) {
console.log('error if statement');
response.statusCode = 409;
response.end();
}
console.log('Done with callback');
});
response.statusCode = 201;
response.end();
Когда я проверить это с именем, которое не является уникальным, я получаю 201 ответ и следующий вывод из моего терминала:
In Unique Name function
Callback for save
Done with callback
About to return false
Я делаю что-то неправильно или это действительно состояние гонки в Мангустасе?
Спасибо! Вы правы, я не понимал, что существует уникальный индекс. – amandawulf
Вы должны подчеркнуть, как уникальный индекс действительно является единственным способом решения этой проблемы. Выполнение поиска в подобном валидаторе приводит к состоянию гонки. После того, как ваш поиск в валидаторе вернется к вам, другой документ может быть вставлен в коллекцию с тем же значением для 'name'. Ваш документ все равно пройдет проверку и продолжит запись, в результате чего будут созданы два документа с одинаковым значением для 'name'. Уникальный индекс MongoDB гарантирует, что этого не произойдет (пока вы не отключите проверку индекса при сохранении). – binki