Derek Brown
Derek Brown

Reputation: 4419

ReferenceError: g is not defined loopback extended models

I am having a nearly identical problem to my previous question. When a user model is created, the following error is returned:

ReferenceError: g is not defined
    at new ModelConstructor (eval at createModelClassCtor (/usr/src/app/node_modules/loopback-datasource-juggler/lib/model-builder.js:671:21), <anonymous>:10:27)
    at user.ModelBaseClass._initProperties (/usr/src/app/node_modules/loopback-datasource-juggler/lib/model.js:349:28)
    at user.ModelBaseClass (/usr/src/app/node_modules/loopback-datasource-juggler/lib/model.js:60:8)
    at user.Model (eval at createModelClassCtor (/usr/src/app/node_modules/loopback-datasource-juggler/lib/model-builder.js:671:21), <anonymous>:12:24)
    at user.PersistedModel (eval at createModelClassCtor (/usr/src/app/node_modules/loopback-datasource-juggler/lib/model-builder.js:671:21), <anonymous>:12:24)
    at user.User (eval at createModelClassCtor (/usr/src/app/node_modules/loopback-datasource-juggler/lib/model-builder.js:671:21), <anonymous>:12:24)
    at new user (eval at createModelClassCtor (/usr/src/app/node_modules/loopback-datasource-juggler/lib/model-builder.js:671:21), <anonymous>:12:24)
    at Function.DataAccessObject.create (/usr/src/app/node_modules/loopback-datasource-juggler/lib/dao.js:359:13)
    at /usr/src/app/node_modules/loopback-datasource-juggler/lib/dao.js:1262:13
    at /usr/src/app/node_modules/loopback-datasource-juggler/lib/dao.js:2175:62
    at /usr/src/app/node_modules/loopback-datasource-juggler/lib/dao.js:2111:9
    at /usr/src/app/node_modules/loopback-datasource-juggler/node_modules/async/dist/async.js:1012:9
    at /usr/src/app/node_modules/loopback-datasource-juggler/node_modules/async/dist/async.js:359:16
    at eachOfArrayLike (/usr/src/app/node_modules/loopback-datasource-juggler/node_modules/async/dist/async.js:928:9)
    at eachOf (/usr/src/app/node_modules/loopback-datasource-juggler/node_modules/async/dist/async.js:990:5)
    at _asyncMap (/usr/src/app/node_modules/loopback-datasource-juggler/node_modules/async/dist/async.js:1005:5)
    at Object.map (/usr/src/app/node_modules/loopback-datasource-juggler/node_modules/async/dist/async.js:995:16)
    at allCb (/usr/src/app/node_modules/loopback-datasource-juggler/lib/dao.js:2025:13)
    at /usr/src/app/node_modules/loopback-connector-mongodb/lib/mongodb.js:1155:9
    at result (/usr/src/app/node_modules/mongodb/lib/utils.js:414:17)
    at executeCallback (/usr/src/app/node_modules/mongodb/lib/utils.js:406:9)
    at handleCallback (/usr/src/app/node_modules/mongodb/lib/utils.js:128:55)

Here are my models:

user.json:

{
  "name": "user",
  "plural": "users",
  "base": "User",
  "idInjection": false,
  "options": {
    "validateUpsert": true
  },
  "properties": {
    "id": {
      "type" : "string",
      "id" : true,
      "required" : true,
      "defaultFn" : "guid"
    },
    "type": {
      "type" : "[string]",
      "required" : true,
      "default" : ["student"]
    },
    "full_name": {
      "type": "string",
      "required": false
    },
    "office" : {
      "type": "string",
      "required" : false
    },
    "profile_img": {
      "type": "string",
      "required": false
    },
    "departmentId": {
      "type": "string",
      "required": false
    }
  },
  "validations": [],
  "relations": {
    "department": {
      "type": "belongsTo",
      "model": "department"
    },
    "syncedcalendar" : {
      "type" : "hasMany",
      "model" : "syncedcalendar"
    },
    "accessTokens": {
       "type": "hasMany",
       "model": "accessToken",
       "foreignKey": "userId",
        "options": {
          "disableInclude": true
        }
     }
  },
  "acls": [],
  "methods": {}
}

accessToken.json

{
  "name": "accessToken",
  "plural": "accessTokens",
  "base": "AccessToken",
  "properties": {},
  "validations": [],
  "idInjection": false,
  "relations": {
    "user": {
      "type": "belongsTo",
      "model": "user",
      "foreignKey": "userId"
    }
  },
  "acls": [],
  "methods": []
}

Upvotes: 1

Views: 2189

Answers (2)

ffflabs
ffflabs

Reputation: 17501

I went through an issue that resembled yours. And yes, the error stack gives too little useful info. It should instead say: "please stick to Loopback types" because that's the problem. You're stuck with Loopback types.

In your case, the parser couldn not handle an array. Well, it turns out it won't parse an un recognized type string either. For example, if you try to declare a property as integer:

 "id":
    {
      "type": "Integer", <-----  not a loopback type
      "id": 1,
      "mysql":
      {
        "columnName": "id",
        "dataType": "int",
     }
  },

It will throw, because the native type is Number. You can format it as integer, but don't mess with its type.

 "id":
    {
      "type": "Number",  <----  one of loopback types. Integer is not one of them
      "id": 1,
      "mysql":
      {
        "columnName": "id",
        "dataType": "int",
      }
      "format":"integer" <---- here's where you can format or cast as desired
  },

If your database values are json-like (so they should rehidrate as arrays and objects) just declare them as Objects.

Upvotes: 1

Derek Brown
Derek Brown

Reputation: 4419

The error above (in both this case and my previous issue) resulted because loopback could not parse the model's json file. In this case, it was the type property of user:

"type": {
  "type" : "[string]",
  "required" : true,
  "default" : ["student"]
},

It seems the default cannot be an array. Removing this default and enforcing this default in a hook resolved the issue.

Upvotes: 1

Related Questions