Meteor框架simpl-schema布尔值转换及XLSX输入验证求助
Hey there! Let’s break down how to get your SimplSchema validation working with your XLSX input data, fix that boolean conversion logic, and capture those missing required fields or type errors properly.
First: Fix the Boolean Value Conversion
Your current code uses a custom function to convert "Yes" to true, but that’s not what custom is designed for. SimplSchema’s custom method is for validation checks, not transforming input values. Instead, use the transform option—it runs before validation and modifies the value to match your schema type.
Here’s how to adjust that field:
subscribeToNewsletter: { type: Boolean, optional: true, transform: (value) => { // Leave undefined values as-is (for optional fields that aren't filled) if (value === undefined) return value; // Normalize input to handle case variations like "YES" or "yes" return value.trim().toLowerCase() === "yes"; } }
Second: Define Your Schema with Proper Required/Optional Rules
Make sure your schema clearly marks required fields by omitting optional: true (or explicitly setting optional: false). For example:
import SimpleSchema from 'simpl-schema'; const UserImportSchema = new SimpleSchema({ // Required fields fullName: { type: String, // No `optional` means this is required }, email: { type: String, optional: false, regEx: SimpleSchema.RegEx.Email // Add format validation for emails }, // Optional field with boolean conversion optInMarketing: { type: Boolean, optional: true, transform: (value) => { if (value === undefined) return value; return value.trim().toLowerCase() === "yes"; } } });
Third: Validate Your XLSX Data Array
Now loop through the array from your client.js, validate each entry, and collect errors with context (like which row in the XLSX has the issue):
// Assume this is your XLSX input array from client.js const xlsxImportData = [ { fullName: "Maria Silva", email: "maria@example.com", optInMarketing: "Yes" }, { fullName: "", email: "joao@example.com" }, // Missing valid fullName { fullName: "Pedro Costa", email: "pedro-invalid-email" }, // Invalid email format { email: "ana@example.com" } // Missing required fullName ]; const validationErrors = []; xlsxImportData.forEach((entry, index) => { try { // Validate the entry, throw an error if validation fails UserImportSchema.validate(entry, { throwException: true }); } catch (error) { // Map the error details to something readable, including the row number validationErrors.push({ rowNumber: index + 1, // XLSX rows start at 1, not 0 issues: error.details.map(detail => ({ field: detail.name, errorMessage: detail.message, providedValue: detail.value })) }); } }); // Output the errors in a user-friendly way if (validationErrors.length > 0) { console.error("Import failed with the following errors:"); validationErrors.forEach(error => { console.log(`Row ${error.rowNumber}:`); error.issues.forEach(issue => { console.log(`- Field "${issue.field}": ${issue.errorMessage} (Input: ${issue.providedValue})`); }); }); } else { console.log("All entries passed validation! Ready to process."); }
Why This Works
transformensures your string input gets converted to a boolean before validation runs, so the type check passes smoothly.- Required fields are automatically validated by SimplSchema—if an entry is missing the field or has an empty/invalid value, it throws a clear error.
- Using
validatewiththrowException: truelets you catch each entry’s errors individually and collect them with context (like row numbers) for easy debugging.
If you were stuck on getting the custom validation to work, switching to transform for value conversion is the key fix here. This aligns with how SimplSchema is designed to handle input processing and validation.
内容的提问来源于stack exchange,提问作者Pedro Martins

