2016-01-19 12 views
6

để xác thực đầu vào của tôi dễ dàng hơn, Tôi đã cố gắng đảm bảo rằng tài liệu mongoose chỉ có thể được tạo, nếu một trường cụ thể được đặt thành true (Trường này, là tất nhiên luôn đúng, NẾU tài liệu đã được tạo đúng cách, đó là vì lý do báo cáo).Mongoose Xác nhận Boolean không hữu ích nếu một chuỗi được cung cấp

Đây là một poc đơn giản:

var mongoose = require('mongoose') 
mongoose.connect('mongodb://localhost:27017/playground') 

var Schema = mongoose.Schema 

var TestSchema = new Schema({ 
    testField: { 
    type: Boolean, 
    required: true 
    } 
}) 

// Try to ensure, that testField can only be true 
TestSchema 
    .path('testField') 
    .validate(function (testField) { 
    return (testField === true || testField === 'true') 
    }, 'Test-field must be true!'); 

var Test = mongoose.model('test', TestSchema); 


var newDoc = Test({ 
    testField: 'some random string' 
}) 

newDoc.save(function (err, newDoc) { 
    (err) ? console.log(err): console.log('newDoc was created') 
}) 

Vấn đề là, rằng mặc dù tôi đang cung cấp một chuỗi ngẫu nhiên thay vì một giá trị Boolean hoặc "chuỗi Boolean" (ví dụ: "false" hoặc "true" để thay thế chỉ sai/đúng), tài liệu vẫn đang được lưu đúng cách, với cờ được đặt thành true.

Nếu tôi cung cấp "false" hoặc false, xác thực hoạt động đúng và đưa ra lỗi.

Rõ ràng, có một số loại kiểu đúc, trước khi xác thực (và rõ ràng là mặc định-hành động) thực sự đang được gọi. Có cách nào để tôi sửa lỗi xác nhận của mình hay tôi phải kiểm tra đối tượng một cách rõ ràng, trước khi tạo Mongoose-Object?

Đây là con cạp 4.3.6.

+0

Bạn đã tìm thấy một giải pháp chưa? Việc ép buộc loại tương tự xảy ra trước khi xác thực với tất cả các loại thuộc tính ... – Codepunkt

+1

Không, chưa. Chỉ có một giải pháp, nơi tôi phân tích cú pháp/xác thực chuỗi trước khi chuyển nó đến xác nhận hợp lệ lược đồ ... – BenSower

+0

Tôi đang có hai lớp xác thực là tốt. Một để khử trùng cơ sở dữ liệu trên tầng cơ sở dữ liệu bằng cách sử dụng mongoose và một để xác thực đầu vào trên lớp điểm cuối. Đang cố gắng sử dụng lại logic xác thực. Tuy nhiên, không thích nó. Vẫn không chắc liệu chúng ta có thực sự cần hai lớp xác thực hay không. – Codepunkt

Trả lời

0

bạn có thể thay đổi loại Boolean để String và xác nhận như thế

 testField: { 
      type : String, 
      required: true, 
      validate: { 
       validator: function (value) { 
        return value === "true" 
       }, 
       message: 'Field must be true' 
      } 
     } 
Các vấn đề liên quan