2017-01-19 16 views
7

Tôi có một đối tượng có tên khóa mà tôi không thể biết - chúng được tạo bởi người dùng. Tuy nhiên tôi biết giá trị của chúng (khóa) sẽ lưu trữ, và chúng (giá trị) sẽ là chuỗi ISO. Làm cách nào để xác thực các giá trị đó? Và, tùy, làm thế nào để xác nhận phím uknown đối tượng, ví dụ:Xác thực đối tượng Joi: Cách xác thực giá trị với các tên khóa không xác định?

key: Joi.string().min(2).max(25) 

Những gì tôi đã cố gắng dựa trên Joi tài liệu API:

Another benefits of using Joi.object([schema]) instead of a plain JS object is >that you can set any options on the object like allowing unknown keys, e.g:

const schema = Joi.object({ arg: Joi.string().valid('firstname', 'lastname', 'title', 'company', 'jobtitle'), value: Joi.string(), }).pattern(/firstname|lastname/, Joi.string().min(2));

Những gì tôi hiểu từ ví dụ là arg phím đại diện cho 's keyvalue đại diện cho nó là value.

dụ của tôi:

campaign: Joi.object({ 
    arg: Joi.string().valid('unknown'), 
    value: Joi.date().iso(), 
}).pattern(/unknown/, Joi.string().min(2).max(25)) 

đầu vào của tôi;

campaign: { g_ad_adwords: "2017-01-19T11:33:26.205Z" } 

lỗi của tôi:

"campaign" fails because ["g_ad_adwords" is not allowed]

Trả lời

8

Hãy thử điều này. Về cơ bản nó sẽ chấp nhận bất kỳ phím nào trong một đối tượng campaign và giá trị phải xác nhận đối với Joi.date().iso()

campaign: Joi.object().pattern(/^/, Joi.date().iso()) 

Tuy nhiên điều này sẽ phù hợp với bất kỳ then chốt. Bạn có thể hạn chế điều này bằng cách thêm regex ra một chút. ví dụ. chỉ các ký tự chữ từ 2 đến 25 ký tự

campaign: Joi.object().pattern(/\w{2,25}/, Joi.date().iso()) 

CẬP NHẬT

Về the example trong tài liệu Joi, tôi đã không kiểm tra nó nhưng đây là giải thích của tôi. Tôi có thể hiểu rằng nó không phải là ví dụ đơn giản nhất mà họ có thể đã đưa ra ...

const schema = Joi.object({ 
    arg: Joi.string().valid('firstname', 'lastname', 'title', 'company', 'jobtitle'), 
    value: Joi.string(), 
}).pattern(/firstname|lastname/, Joi.string().min(2)); 

Đối tượng để xác nhận phải chứa hai thuộc tính argvalue nơi giá trị arg 's có thể là một trong những 'firstname', 'lastname', 'title', 'company', 'jobtitle'value chỉ là một chuỗi.

{ 
    arg: 'firstname', 
    value: 'john' 
} 

{ 
    arg: 'lastname', 
    value: 'smith' 
} 

{ 
    arg: 'jobtitle', 
    value: 'brewer' 
} 

Tuy nhiên nó cũng sẽ cho phép các đối tượng có các thuộc tính firstnamelastname nơi mà cả các giá trị của họ là một chuỗi với hơn hai nhân vật. Vì vậy, các ví dụ trên có thể được cô đặc thành một đối tượng hợp lệ duy nhất.

{ 
    firstname: 'john', 
    lastname: 'smith', 
    arg: 'jobtitle', 
    value: 'brewer' 
} 
Các vấn đề liên quan