Trung Tran
Trung Tran

Reputation: 13721

Simple Schema error in Meteor

I am using the meteor accounts and simple schema for users to register and enter their profile information in my app. I defined a schema for users and attached a schema for address to it. However, when I go to register an account, I keep getting the error "Address required" although I filled out all the required fields for address. Here's my schema:

Schemas.UserAddress = new SimpleSchema({ //UserAddress schema defined

streetAddress: {
    type: String,
    max: 100,
    optional: false
},
city: {
    type: String,
    max: 50,
    optional: false
},
state: {    
    type: String,
    regEx: /^A[LKSZRAEP]|C[AOT]|D[EC]|F[LM]|G[AU]|HI|I[ADLN]|K[SY]|LA|M[ADEHINOPST]|N[CDEHJMVY]|O[HKR]|P[ARW]|RI|S[CD]|T[NX]|UT|V[AIT]|W[AIVY]$/,
    optional: false
},
zipCode: {
type: String,
regEx: /^[0-9]{5}$/,
optional: false

} });

var Schemas = {};

Schemas.UserProfile = new SimpleSchema({
companyName: {
    type: String,
    regEx: /^[a-zA-Z-]{2,25}$/,
    optional: false
},
tireMarkup: {
    type: Number,
    optional: true,
    min: 1
},
phoneNum: {
    type: String,
    regEx: /^[(]{0,1}[0-9]{3}[)]{0,1}[-\s\.]{0,1}[0-9]{3}[-\s\.]{0,1}[0-9]{4}$/,
    optional: false    
},
confirmed: {
    type: Boolean,
    optional: true
},
});


Schemas.User = new SimpleSchema({
emails: {
    type: [Object],
    optional: false
},
"emails.$.address": {
    type: String,
    regEx: SimpleSchema.RegEx.Email
},
"emails.$.verified": {
    type: Boolean
},
createdAt: {
    type: Date
},
profile: {
    type: Schemas.UserProfile,
    optional: false
},
address: { //Attach user address schema
    type: Schemas.UserAddress, 
    optional: false
},
services: {
    type: Object,
    optional: true,
    blackbox: true
}
});

Meteor.users.attachSchema(Schemas.User);

Here is my accounts config which creates the sign up form:

Meteor.startup(function () {
AccountsEntry.config({
  logo: '',                  // if set displays logo above sign-in options
  termsUrl: '/terms-of-use',         // if set adds link to terms  'you agree to ...' on sign-up page
  homeRoute: '/',                    // mandatory - path to redirect to after sign-out
  dashboardRoute: '/dashboard/',      // mandatory - path to redirect to after successful sign-in
  profileRoute: '/profile',
  passwordSignupFields: 'EMAIL_ONLY',
  showOtherLoginServices: true,      // Set to false to hide oauth login buttons on the signin/signup pages. Useful if you are using something like accounts-meld or want to oauth for api access
  extraSignUpFields: [

     {
        field: "companyName",                           
        label: "Company Name",                     
        placeholder: "Petrocon",                
        type: "text",                           
        required: true                         
    },
    {
        field: "firstName",                       
        label: "First Name",                    
        placeholder: "John",                
        type: "text",                            
        required: true                           
    },  
    {
        field: "lastName",                          
        label: "Last Name",                      
        placeholder: "Nguyen",                 
        type: "text",                            
        required: true                          
    },
    {   field: "streetAddress",
        label: "Street Address",
        placeholder: "12345 Main Street",
        type: "text",
        required: true
    },
    {   field: "city",
        label: "City",
        placeholder: "Springfield",
        type: "text",
        required: true
    },
    {   field: "state",
        label: "State",
        placeholder: "Missouri",
        type: "text",
        required: true
    },
    {   field: "zipCode",
        label: "Zip Code",
        placeholder: "65801",
        type: "text",
        required: true
    },
    {
        field: "phoneNum",                          
        label: "Contact Number",                     
        placeholder: "316-000-0000",                 
        type: "text",                            
        required: true                           
    }  
    ]
});
});

As you can see, I defined all of the fields in the address schema in AccountsEntry.config.. therefore I don't know why when I enter all the information in the form, I get the error 'address required'. Does anyone know what's going on? Thank you in advance!

Upvotes: 1

Views: 659

Answers (1)

Mark Leiber
Mark Leiber

Reputation: 3138

Looks like you're using the accounts-entry package. You can see the code where the account is created in this file:

https://github.com/Differential/accounts-entry/blob/9aac00cb3c67afcbb1cc990c7af1f2c7607a2337/server/entry.coffee

Line 29 looks like this:

profile: _.extend(profile, user.profile)

If you debug and look at the value of profile after the extend method is called, you'll see this:

{
    "companyName": "Petrocon",
    "firstName": "John",
    "lastName": "Nguyen",
    "streetAddress": "12345 Main Street",
    "city": "Springfield",
    "state": "Missouri",
    "zipCode": "65801",
    "phoneNum": "316-000-0000"
}

There is no property named "address" for your Schemas.User schema.

There might be some slick way to do what you're looking for, but the easiest approach is to just get rid of the Schemas.UserAddress schema. Move those properties (streetAddress, city, state, zipCode) into the Schemas.UserProfile schema and it will work.

Upvotes: 1

Related Questions