这是我的架构:
tango.schema.js
200
以下测试失败。它返回400
而不是it('Sim has no name', function(done) {
delete testTango.sims[0].name;
agent
.post('/tangos')
.send(testTango)
.expect(400)
.end(function(err, res) {
if (err) {
return done(err);
}
var result = JSON.parse(res.text);
assert(result.error);
assert.equal(result.error, 'Tango validation failed');
done();
})
;
});
:
200
我原以为由于发送的Tango对象有一个与SimSchema不匹配的Sim,因此无法成功创建Tango。相反,它正在成功创建Tango并发送回type: [SimSchema]
。
这是为什么?不是name = input('Enter your name: ')
nl = name.split()
nl.reverse()
print(*nl)
应该说,“这个属性必须是与SimSchema匹配的对象数组”?
答案 0 :(得分:0)
问题不在于验证,而在于操纵对象本身。在尝试从数组中的示例数据中删除“name”属性时,您将此视为JavaScript对象,但问题是这不是一个纯JavaScript对象,而是一个mongoose文档结构。
令人困惑的是,mongoose文档试图“看起来像”一个普通的JavaScript对象,但实际上你试图操作的属性实际上根本不是普通的属性。随后,改变什么也没做;
使用基本代码重现:
var mongoose = require('mongoose'),
Schema = mongoose.Schema;
mongoose.connect('mongodb://localhost/test');
var childSchema = new Schema({
name: { type: String, required: true }
});
var parentSchema = new Schema({
name: { type: String, required: true },
children: { type: [childSchema], required: true }
});
var Parent = mongoose.model('Parent', parentSchema);
var obj = new Parent({ name: "Homer", children: [{ name: "Bart"}] });
console.log(obj);
//obj = obj.toObject();
delete obj.children[0].name;
console.log(obj);
这表明尽管进行了操纵尝试,但一切都没有改变:
{ name: 'Homer',
_id: 55fb841ce300c51e0ef842e3,
children: [ { name: 'Bart', _id: 55fb841ce300c51e0ef842e4 } ] }
{ name: 'Homer',
_id: 55fb841ce300c51e0ef842e3,
children: [ { name: 'Bart', _id: 55fb841ce300c51e0ef842e4 } ] }
大提示是那里的注释行,因为您需要先将其更改回常规对象,然后再将其作为mongoose文档进行转换:
obj = obj.toObject();
delete obj.children[0].name;
console.log(obj);
obj = new Parent(obj);
obj.save(function(err) {
console.log(err);
});
添加这些行会产生重大影响:
{ name: 'Homer',
_id: 55fb85439652ee2c0ec8800e,
children: [ { name: 'Bart', _id: 55fb85439652ee2c0ec8800f } ] }
{ name: 'Homer',
_id: 55fb85439652ee2c0ec8800e,
children: [ { _id: 55fb85439652ee2c0ec8800f } ] }
{ [ValidationError: Parent validation failed]
message: 'Parent validation failed',
name: 'ValidationError',
errors:
{ 'children.0.name':
{ [ValidatorError: Path `name` is required.]
您也不应该在这些数组字段上使用自定义验证器。简单地设置required
如果从对象中省略它或者只发送空数组,则会抛出异常。当然,如果数组文档内容与子模式定义不匹配,那么也会触发该验证。