簡體   English   中英

Mongoose自定義驗證無法在控制器中工作

[英]Mongoose custom validation not working in controller

我的貓鼬模型包含一個字段,只有當另一個字段等於特定值時才需要該字段(即它是有條件的)。

在這個例子中,我有具有“的typeA”或“的TypeB”的ITEMTYPE項目 只有'typeB'才需要字段someField

在我的測試中,驗證似乎在直接測試模型時起作用。 但是,驗證不會在控制器中觸發。

我的模型如下:

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'根本沒有值,則會正確拋出錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM