#node.js #mongodb #mongoose
#node.js #mongodb #mongoose
Вопрос:
У меня есть такая модель схемы:
var propertySchema = new Schema({
name: {type: String, required: true},
surname: String
});
var objSchema = new Schema({
properties: [prepertySchema]
});
var accountSchema = new Schema({
objects: [objSchema]
});
mongoose.model('account', accountSchema);
Затем у меня есть операции:
account.objects.push(null);
account.save(function(error, account) {
//Error checking and response
})
В этом случае я получаю ошибку ValidationError из-за нулевого значения. Это ожидаемо. Но в следующих операциях:
var obj = {properties: null}
account.objects.push(obj);
account.save(function(error, account) {
//Error checking and response
})
Здесь значение сохраняется в базе данных, а затем у меня появляется неожиданное нулевое значение там, где оно было массивом. Выполнение этого с такими объектами,
var obj = {
properties: [{name:'randname'}, null]
}
Также сохраняет в базе данных значения null, которые запрещены для модели данных.
Я читал о валидаторах и промежуточном программном обеспечении для проверки вещей. Есть ли способ сделать это непосредственно в схеме, или я должен проанализировать полученный объект, прежде чем сохранить его в базе данных? Каков наилучший подход для этого?
Ответ №1:
Ну, вы могли бы просто использовать определения модели для этого. Даже если вы внедряете, вы все равно можете это сделать, но, конечно, вы не хотите фактически сохранять объекты в их собственной коллекции. Просто введите их в элемент как встроенные:
var async = require("async"),
mongoose = require("mongoose"),
Schema = mongoose.Schema;
mongoose.connect('mongodb://localhost/prop');
var propertySchema = new Schema({
name: { type: String, required: true },
surname: String
});
var objSchema = new Schema({
properties: [propertySchema],
});
var accountSchema = new Schema({
objects: [objSchema]
});
var Account = mongoose.model( 'account', accountSchema );
var ObjMod = mongoose.model( 'ObjMod', objSchema, null, false );
var PropMod = mongoose.model( 'PropMod', propertySchema, null, false );
var account = new Account();
var prop = new PropMod({ "name": null });
var obj = new ObjMod({ properties: prop });
account.objects.push( obj );
account.save(function(err,account) {
if (err) throw err;
console.log( JSON.stringify( account, undefined, 4 ) );
});
Итак, что происходит, проверка будет работать для каждого этапа, в этом случае она завершится неудачей, если имя элемента схемы свойств не является строкой или даже если оно не включено.
Комментарии:
1. Спасибо за быстрый ответ! Я пробовал это, но случай, когда var obj = new ObjMod({ properties: null }); все равно вставляет null в базу данных. Есть способ решить эту проблему?
2. @Sugarl3ss в этом случае вы можете добавить другую проверку. Просто проблема, когда
null
тип не попадает в базовую проверку. Но дело в том, что если вы структурируете таким образом, то большинство ваших проблем должны исчезнуть без написания большого количества кода проверки.3. Хорошо, тогда я добавлю несколько валидаторов для этих случаев.