-
Notifications
You must be signed in to change notification settings - Fork 1.2k
Description
Description/Steps to reproduce
- Scaffold a new loopback project using the CLI (eg.
lb) - In
server/model-config.jsonfind the builtin model reference:
"User": {
"dataSource": "db"
},
and replace with the custom model reference:
"user": {
"dataSource": "db"
},
the user name for the custom model as it is used as seen in other examples, I will retest with a custom model name as well
- Create a new model setting
Useras thebasevalue (for example see loopback-example-access-control), an overly simplified example might look like:
{
"name": "user",
"base": "User",
"hidden": ["password", "verificationToken"]
}
- Create a boot script (eg.
/server/boot/setup.js) with the following
'use strict';
module.exports = function(app) {
var User = app.models.user;
User.create({
username: 'foo',
email: 'foo@bar.com',
password: 'changeme'
}, (err, user) => {
if (err) {
throw err;
}
user.email = 'bar@foo.com';
user.save((saveErr, user) => {
if (saveErr) {
throw saveErr;
}
// won't make it here, error is thrown
// TypeError: Cannot read property 'polymorphic' of undefined
});
});
};- Run the loopback application
The following will produce an error such as:
/code/loopback-sample/node_modules/loopback/common/models/user.js:695
var isRelationPolymorphic = relatedUser.polymorphic && !relatedUser.modelTo;
^
TypeError: Cannot read property 'polymorphic' of undefined
at Function.User._invalidateAccessTokensOfUsers (/code/loopback-sample/node_modules/loopback/common/models/user.js:695:44)
at invalidateOtherTokens (/code/loopback-sample/node_modules/loopback/common/models/user.js:927:15)
at notifySingleObserver (/code/loopback-sample/node_modules/loopback-datasource-juggler/lib/observer.js:104:22)
at /code/loopback-sample/node_modules/async/dist/async.js:3025:16
at replenish (/code/loopback-sample/node_modules/async/dist/async.js:881:17)
at /code/loopback-sample/node_modules/async/dist/async.js:885:9
at eachLimit$1 (/code/loopback-sample/node_modules/async/dist/async.js:3114:22)
at Object.<anonymous> (/code/loopback-sample/node_modules/async/dist/async.js:917:16)
at doNotify (/code/loopback-sample/node_modules/loopback-datasource-juggler/lib/observer.js:101:11)
at doNotify (/code/loopback-sample/node_modules/loopback-datasource-juggler/lib/observer.js:99:49)
at doNotify (/code/loopback-sample/node_modules/loopback-datasource-juggler/lib/observer.js:99:49)
at doNotify (/code/loopback-sample/node_modules/loopback-datasource-juggler/lib/observer.js:99:49)
at Function.ObserverMixin._notifyBaseObservers (/code/loopback-sample/node_modules/loopback-datasource-juggler/lib/observer.js:122:5)
at Function.ObserverMixin.notifyObserversOf (/code/loopback-sample/node_modules/loopback-datasource-juggler/lib/observer.js:97:8)
at Function.ObserverMixin._notifyBaseObservers (/code/loopback-sample/node_modules/loopback-datasource-juggler/lib/observer.js:120:15)
at Function.ObserverMixin.notifyObserversOf (/code/loopback-sample/node_modules/loopback-datasource-juggler/lib/observer.js:97:8)Expected result
The user should save without any errors.
Additional information
This example is not an issue for v2.x or v3.x up to 3.2.1, this only surfaced with v3.3.0.
Based on the outcome of issue 103 for loopback-example-access-control this may not actually be an issue at all and just needs some updates to the docs?
For v3.3.0 the bug is not present when you have a custom model with User as base and retain the builtin User model reference in model-config.json. If it became a requirement to always have User model in situations like this the documentation should be updated accordingly. It should also then be discouraged for using builtin models as the base for custom models with the same name (eg. User builtin vs user custom).