2017-03-24 20 views
5

Tôi đang sử dụng Joi để xác thực tải trọng của dịch vụ trong máy chủ node.js của tôi bằng cách sử dụng khung công tác hapijs. Nó được sử dụng để trông giống như thế này (trong mã số của tôi cũng như sau khi biên dịch sang javascript):Đặt giá trị mặc định của xác thực

payload: { 
    para1: Joi.number().required(), 
    para2: Joi.string() 
} 

Bây giờ tôi muốn đặt giá trị mặc định của hai tham số. Nếu mã được viết bằng javascript, tôi có thể thực hiện việc này:

payload: { 
    para1: Joi.number().required().default(1), 
    para2: Joi.string().default("defaultstring") 
} 

Tôi đã thử nghiệm nó theo dạng chuyển đổi và giá trị mặc định thực sự trở thành giá trị tôi đặt.

Tuy nhiên, dự án của tôi được viết bằng bản ghi. Tôi đã làm điều tương tự và biên dịch mã số. Kết quả javascript trông giống như sau:

payload: { 
    para1: Joi.number().required()["default"](1), 
    para2: Joi.string()["default"]("defaultstring") 
} 

Trong quá trình chuyển đổi, giá trị mặc định không được áp dụng.

Dưới đây là những câu hỏi của tôi:

  1. tại sao đoạn code trở nên khác nhau sau khi biên dịch?
  2. ["default"]("defaultstring") có nghĩa là gì và nó hoạt động như thế nào?
  3. làm thế nào tôi có thể viết mã typescript để chắc chắn rằng nó có thể biên soạn như Joi.string().default("defaultstring")

Cập nhật

Theo bài @ RSP của, định dạng trong câu hỏi 2 chỉ là cách khác để truy cập tài sản của đối tượng. Tôi cũng nhận được tài liệu tham khảo từ here. Nhưng nó không giải thích nếu họ có bất kỳ sự khác biệt nào. Có ai có ý kiến ​​gì không?

Update2

Here là sự khác biệt giữa hai cách truy cập thuộc tính JS. Có vẻ như không có hiệu ứng tiêu cực bằng cách sử dụng dấu ngoặc vuông. Tuy nhiên, trong trường hợp của tôi, các giá trị mặc định không được phản ánh trên vênh vang. Sẽ nghiên cứu về nó.

+0

Cuối cùng đã tìm ra. Khi tôi sử dụng kiểu chữ, các ghi chú dao găm được tạo từ hàm ban đầu của kiểu chữ, không phải từ tệp JS. Không có vấn đề với chính mã. – zhangjinzhou

Trả lời

2

Trong JavaScript này:

required().default(1) 

cũng giống như thế này:

required()["default"](1) 

vì bạn có thể truy cập vào thuộc tính đối tượng hoặc là:

object["propertyName"] 

hay:

object.propertyName 

(với các hạn chế nhất định trong trường hợp thứ hai).

Vì vậy, thật kỳ lạ khi TypeScript sẽ xuất ra kiểu dài hơn nếu nó không phải, nhưng nó cũng lạ khi kiểu dài hơn không hoạt động chính xác giống như kiểu ngắn hơn.

Tôi sẽ cố gắng thay đổi JavaScript đã biên dịch theo cách thủ công thành phiên bản ngắn hơn và xem điều đó có hữu ích không.Nếu không thì vấn đề là ở nơi khác. Nghi ngờ của tôi là nó sẽ không giúp được gì.

Các .default() nên làm việc trong nguyên cảo bởi vì nó được định nghĩa trong @types/joi - xem:

Nhưng mặt khác có nhận xét này:

// TODO express type of Schema in a type-parameter (.default, .valid, .example etc) 

nào có thể đề xuất rằng triển khai .default() chưa sẵn sàng - xem:

và cũng có vấn đề này: joi.d.ts out of date, missing types

+0

Cảm ơn câu trả lời. Thật tốt khi biết rằng có một cách khác để truy cập đối tượng trong JS. Có lẽ tôi không thể đưa bạn giải pháp bởi vì thay đổi JavaScript biên dịch không phải là một cách bền vững để xử lý vấn đề. Tôi sử dụng gulp khi phát triển phần mềm. Vì vậy mỗi khi tôi thay đổi một cái gì đó tất cả các tập tin sẽ được biên dịch lại. – zhangjinzhou

+0

nếu các kiểu @/joi không được phát triển tốt, tại sao nó vẫn được biên dịch thành JS kiểu dài hơn? – zhangjinzhou

0

Sử dụng nên sử dụng mặc định() thích ở bên dưới mã:

validate: { 
     payload: { 
      para1: Joi.number().integer().min(1).max(100).default(10).required(), 
      para2: Joi.string().min(1).max(100).default("TEST").required(), 
     } 
    } 
+0

sự khác biệt là gì? Tôi nghĩ rằng nó hoạt động giống như mã của tôi – zhangjinzhou

+0

Không có gì khác biệt nhưng ở trên mã được định dạng và hoàn thành khối. –

+0

Cảm ơn bạn! Sẽ ghi nhớ điều này. – zhangjinzhou

Các vấn đề liên quan