猫鼬自定义验证在控制器中不起作用

鼠树

我的猫鼬模型包含一个仅在其他字段等于特定值(即有条件)时才需要的字段。

在这个例子中,我有一个项目,其具有ITEMTYPE “的typeA”或“的TypeB”的。字段someField仅对于'typeB'是必需的。

在我的测试中,当直接针对模型进行测试时,验证似乎可以正常工作。但是,验证不会在控制器中触发。

我的模型如下:

var mongoose = require('mongoose'),
  Schema = mongoose.Schema;

var ItemSchema = new Schema({
  name: {
    type: String,
    trim: true,
    required: true
  },
  itemType: {
    type: String,
    enum: ['typeA', 'typeB'],
    required: true
  },
  someField: String
});

ItemSchema
  .path('someField')
  .validate(function(value, respond) {
    if (this.itemType === 'typeA') { return respond(true); }
    return respond(validatePresenceOf(value));
  }, 'someField cannot be blank for typeB');

function validatePresenceOf(value) {
  return value && value.length;
}

module.exports = mongoose.model('Item', ItemSchema);

在我对该模型的单元测试中:

it('should fail when saving typeB without someField', function(done) {

  var item = new Item({
    name: 'test',
    itemType: 'typeB'
  });

  item.save(function(err){
    should.exist(err);
    done();
  });

});

上面的单元测试没有问题。但是,在测试API本身时,Mongoose不会引发错误。如果控制器无法保存,则应该返回500错误:

exports.create = function(req, res) {
  var item = new Item(req.body);
  item.save(function(err, data) {
    if (err) { return res.json(500, err); }
    return res.json(200, data);
  });
};

但是,以下测试始终返回200:

var request = require('supertest');

describe('with invalid fields', function() {
  it('should respond with a 500 error', function(done) {
    request(app)
      .post('/api/item')
      .send({
        name: 'test',
        itemType: 'typeB'
        })
      .expect(500)
      .end(function(err, res) {
        if (err) return done(err);
        return done();
        });
      });
  });
});

我不确定自己在做什么错,保存在控制器中时似乎未触发Mongoose验证。

尼尔·伦恩

此处的实现是错误的方法。您不需要在“ someField”上进行验证,而是在传递给“ itemType”的值上进行验证。原因是因为您没有为“ someField”提供任何值,所以由于未定义任何内容,因此永远不会调用验证器。

因此,测试将以另一种方式运行,并纠正您的validatePresenceOf()功能:

itemSchema.path('itemType').validate(function(value) {
  if ( value === 'typeA' )
    return true;
  console.log( validatePresenceOf(this.someField) );
  return validatePresenceOf(this.someField);

}, 'someField cannot be blank for itemType: "typeB"');

function validatePresenceOf(value) {
  if ( value != undefined )
    return value && value.length
  else
    return false;
}

如果'itemType'设置为'typeB'并且'someField'没有任何值,那将正确抛出错误。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

猫鼬:简单的自定义验证功能不起作用

控制器中的自定义操作在yii2中不起作用

图例标签自定义在模型控制器中不起作用

UITapGestureRecognizer在自定义类中不起作用(不是视图控制器)

Laravel redirect()-> intended()在自定义登录控制器中不起作用

监视工厂对象在自定义指令的控制器中不起作用

API 平台 - 自定义控制器/动作描述注释不起作用

创建自定义操作和控制器示例不起作用

Symfony PHP自定义异常控制器不起作用

自定义子视图控制器的宽度和高度不起作用

BooleanField自定义验证器不起作用

角度4:自定义验证器不起作用

Django自定义验证器不起作用

角度自定义异步验证器不起作用

Codeigniter:表单验证在控制器中不起作用

“ required:true”的猫鼬验证器不起作用

唯一验证在猫鼬中不起作用

我在 AdonisJs 中的自定义验证器不起作用

Spring中的自定义约束验证器不起作用

Angular 6:setTimeout函数在我的自定义验证器中不起作用

异步自定义验证器不起作用并在Angular 8中显示错误消息

Angular Reactive Forms 中的自定义验证器不起作用

在猫鼬更新查询中运行自定义验证

猫鼬5.7.0中的自定义验证

自定义单元格Segue将数据发送到Second View控制器不起作用

自定义快速验证器验证器不起作用

按钮上的欧芹验证 + 自定义验证器不起作用

控制器方法上的自定义验证器

$ unset在猫鼬中不起作用