javascriptreactjstypescriptmeteorsimpl-schema

TypeError: SimpleSchema is not a constructor in Meteor 1.6 project


I am creating a SimpleSchema for my staff collection in Meteor and I am getting error "TypeError: SimpleSchema is not a constructor" in my server console. I've gone through the SimpleSchema documentation and this constructor is there, my code is same as their example. Not sure why this error is coming.

Server console Error

W20180516-23:44:46.314(2)? (STDERR) /Users/anarayan/.meteor/packages/meteor-tool/.1.6.1_1.1rttc72.ip8ui++os.osx.x86_64+web.browser+web.cordova/mt-os.osx.x86_64/dev_bundle/server-lib/node_modules/fibers/future.js:280
W20180516-23:44:46.315(2)? (STDERR)                         throw(ex);
W20180516-23:44:46.315(2)? (STDERR)                         ^
W20180516-23:44:46.316(2)? (STDERR) 
W20180516-23:44:46.316(2)? (STDERR) TypeError: SimpleSchema is not a constructor
W20180516-23:44:46.316(2)? (STDERR)     at Staffs.js (imports/api/Staffs/Staffs.js:20:17)
W20180516-23:44:46.317(2)? (STDERR)     at fileEvaluate (packages/modules-runtime.js:343:9)
W20180516-23:44:46.317(2)? (STDERR)     at require (packages/modules-runtime.js:238:16)
W20180516-23:44:46.318(2)? (STDERR)     at methods.js (imports/api/Staffs/methods.js:1:193)
W20180516-23:44:46.318(2)? (STDERR)     at fileEvaluate (packages/modules-runtime.js:343:9)
W20180516-23:44:46.318(2)? (STDERR)     at require (packages/modules-runtime.js:238:16)
W20180516-23:44:46.319(2)? (STDERR)     at api.js (imports/startup/both/api.js:1:67)
W20180516-23:44:46.319(2)? (STDERR)     at fileEvaluate (packages/modules-runtime.js:343:9)
W20180516-23:44:46.319(2)? (STDERR)     at require (packages/modules-runtime.js:238:16)
W20180516-23:44:46.320(2)? (STDERR)     at index.js (imports/startup/server/index.js:1:50)
W20180516-23:44:46.320(2)? (STDERR)     at fileEvaluate (packages/modules-runtime.js:343:9)
W20180516-23:44:46.320(2)? (STDERR)     at require (packages/modules-runtime.js:238:16)
W20180516-23:44:46.321(2)? (STDERR)     at main.js (server/main.js:1:14)
W20180516-23:44:46.321(2)? (STDERR)     at fileEvaluate (packages/modules-runtime.js:343:9)
W20180516-23:44:46.321(2)? (STDERR)     at require (packages/modules-runtime.js:238:16)
W20180516-23:44:46.322(2)? (STDERR)     at /Users/anarayan/project/BusApp/.meteor/local/build/programs/server/app/app.js:7391:1
W20180516-23:44:46.323(2)? (STDERR)     at /Users/anarayan/project/BusApp/.meteor/local/build/programs/server/boot.js:411:36
W20180516-23:44:46.323(2)? (STDERR)     at Array.forEach (<anonymous>)
W20180516-23:44:46.323(2)? (STDERR)     at /Users/anarayan/project/BusApp/.meteor/local/build/programs/server/boot.js:220:19
W20180516-23:44:46.324(2)? (STDERR)     at /Users/anarayan/project/BusApp/.meteor/local/build/programs/server/boot.js:471:5
W20180516-23:44:46.324(2)? (STDERR)     at Function.run (/Users/anarayan/project/BusApp/.meteor/local/build/programs/server/profile.js:510:12)
W20180516-23:44:46.324(2)? (STDERR)     at /Users/anarayan/project/BusApp/.meteor/local/build/programs/server/boot.js:470:11

and Here is the class

/* eslint-disable consistent-return */

import { Mongo } from 'meteor/mongo';
import { SimpleSchema } from 'simpl-schema';

const Staffs = new Mongo.Collection('staffs');

Staffs.allow({
  insert: () => false,
  update: () => false,
  remove: () => false,
});

Staffs.deny({
  insert: () => true,
  update: () => true,
  remove: () => true,
});

Staffs.schema = new SimpleSchema({
  name: {
    type: String,
    label: 'Staff Name',
  },
  email: {
    type: String,
    label: 'Staff email id',
  },
  mobile: {
    type: String,
    label: 'Staff mobile number',
  },
  status: {
    type: String,
    label: 'Staff Status',
  },
  role: {
    type: String,
    label: 'Role name',
  },
  location: {
    type: String,
    label: 'Location from where staff belongs',
  },
  createdAt: {
    type: String,
    label: 'The date this document was created.',
    autoValue() {
      if (this.isInsert) return (new Date()).toISOString();
    },
  },
  updatedAt: {
    type: String,
    label: 'The date this document was last updated.',
    autoValue() {
      if (this.isInsert || this.isUpdate) return (new Date()).toISOString();
    },
  },
});

Staffs.attachSchema(Staffs.schema);

export default Staffs;

Thanks for helping me out.


Solution

  • You need to import the package without curly brackets because it is exported to the public as default export:

    import SimpleSchema from 'simpl-schema'; 
    

    Because of this you could even import it this way:

    import MyRenamedSchema from 'simpl-schema'; 
    

    Which could then be called by the other named constructor new MyRenamedSchema

    Resources

    Quick start of the documentation:

    https://github.com/aldeed/simple-schema-js/blob/master/README.md#quick-start

    Export types:

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/export