猫鼬没有验证类型:[SimSchema]

时间:2015-09-18 02:36:33

标签: node.js mongodb mongoose

这是我的架构:

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匹配的对象数组”?

1 个答案:

答案 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如果从对象中省略它或者只发送空数组,则会抛出异常。当然,如果数组文档内容与子模式定义不匹配,那么也会触发该验证。