2016-12-23 74 views
0

我試圖運行此驗證,但由於某種原因它驗證參數,即使我將可選設置爲true。有沒有人知道我做錯了什麼?節點快速驗證可選選項不起作用

var schema = { 
    "title": { 
    in: "body", 
    optional: true, 
    isLength: { 
     options: [{ min: 1, max: 128 }], 
     errorMessage: 'Title must be between 1 and 128 characters' 
    } 
    } 
} 
req.check(schema) 

回答

2

直起docs它說:

您可以使用可選的()方法來跳過驗證。默認情況下,如果請求對象上不存在密鑰,它只會跳過驗證。如果你想跳過基於falsy屬性(null,undefined等)的驗證,你可以傳入{checkFalsy:true}。

我假設您的情況下,標題密鑰存在於請求正文中,但值是空白字符串。所以checkFalsy值將不起作用。至少它從來沒有爲我做過。要使驗證可選,您可以創建一個自定義驗證程序並將其用於您的模式中:

this.app = express(); 

this.app.use(expressValidator({ 
    customValidators: { 
    isLengthOptional: (str, options) => { 
     // make it optional 
     if (str === undefined || str === '') { 
     return true; 
     } 
     const min = options.min || 0; 
     const max = options.max; 
     const surrogatePairs = str.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g) || []; 
     const len = str.length - surrogatePairs.length; 
     return len >= min && (typeof max === 'undefined' || len <= max); 
    } 
    } 
}); 
var schema = { 
    "title": { 
    in: "body", 
    optional: true, 
    isLengthOptional: { 
     options: [{ min: 1, max: 128 }], 
     errorMessage: 'Title must be between 1 and 128 characters' 
    } 
    } 
} 
req.check(schema) 
+0

哇,這很不錯。謝謝! –

0

模式中的可選標誌意味着該字段可以省略,以防它提示它必須遵循所提供的規則。

在你的例子中,這將被認爲是有效的,因爲「標題」被省略。

{ 
    "body": {} 
} 

同時,這將是無效的,因爲「標題」是存在的,但沒有按照規則

{ 
    "body": { 
    "title": null 
    } 
} 

這是基於你貼什麼只是我的假設,如果你提供了更多的信息,它會調試起來要容易得多。例如:
您向您的應用發送了哪個請求?
您從該請求得到的迴應是什麼?