错误:循环依赖:带有回送护照示例的“用户”

我试图使用Strongloop loopback和loopback-component-passport,但不能完全弄清楚如何获得内置的用户模型和环回组件护照提供的模型之间的关系

它看起来像在loopback-component-passport / lib / models / * .json文件中提供的关系,但是我得到以下错误:

Error: Cyclic dependency: "User" at visit (/work/node/loopback/myapp/node_modules/loopback-boot/node_modules/toposort/index.js:29:13) at visit (/work/node/loopback/myapp/node_modules/loopback-boot/node_modules/toposort/index.js:43:9) at toposort (/work/node/loopback/myapp/node_modules/loopback-boot/node_modules/toposort/index.js:22:22) at module.exports.exports (/work/node/loopback/myapp/node_modules/loopback-boot/node_modules/toposort/index.js:10:10) at sortByInheritance (/work/node/loopback/myapp/node_modules/loopback-boot/lib/compiler.js:248:21) at buildAllModelInstructions (/work/node/loopback/myapp/node_modules/loopback-boot/lib/compiler.js:205:10) at compile (/work/node/loopback/myapp/node_modules/loopback-boot/lib/compiler.js:79:27) at bootLoopBackApp (/work/node/loopback/myapp/node_modules/loopback-boot/index.js:128:22) at Object.<anonymous> (/work/node/loopback/myapp/server/server.js:44:1) at Module._compile (module.js:456:26) [stu:/work/node/loopback/myapp (master)]$ 

这是我的model-config.json

 { "_meta": { "sources": [ "loopback/common/models", "loopback/server/models", "../common/models", "./models", "../node_modules/loopback-component-passport/lib/models" ] }, "User": { "dataSource": "db", "public": true }, "UserCredential": { "dataSource": "db", "public": true }, "UserIdentity": { "dataSource": "db", "public": true }, "AccessToken": { "dataSource": "db", "public": false }, "ACL": { "dataSource": "db", "public": false }, "RoleMapping": { "dataSource": "db", "public": false }, "Role": { "dataSource": "db", "public": false }, "KnowBit": { "dataSource": "localpg", "public": true } } 

通过使用loopback启用debugging:boot:编译器

 $ DEBUG=loopback:boot:compiler slc run 

我能够得到这些日志:

 [stu:/work/node/loopback/myapp (master)]$ DEBUG=loopback:boot:compiler slc run INFO strong-agent API key not found, StrongOps dashboard reporting disabled. Generate configuration with: npm install -g strongloop slc strongops See http://docs.strongloop.com/strong-agent for more information. supervisor running without clustering (unsupervised) loopback:boot:compiler Found model "AccessToken" - ../node_modules/loopback/common/models/access-token.json ../node_modules/loopback/common/models/access-token.js +0ms loopback:boot:compiler Found model "ACL" - ../node_modules/loopback/common/models/acl.json ../node_modules/loopback/common/models/acl.js +1ms loopback:boot:compiler Found model "Application" - ../node_modules/loopback/common/models/application.json ../node_modules/loopback/common/models/application.js +0ms loopback:boot:compiler Found model "Change" - ../node_modules/loopback/common/models/change.json ../node_modules/loopback/common/models/change.js +1ms loopback:boot:compiler Found model "Checkpoint" - ../node_modules/loopback/common/models/checkpoint.json ../node_modules/loopback/common/models/checkpoint.js +0ms loopback:boot:compiler Found model "Email" - ../node_modules/loopback/common/models/email.json ../node_modules/loopback/common/models/email.js +0ms loopback:boot:compiler Found model "RoleMapping" - ../node_modules/loopback/common/models/role-mapping.json ../node_modules/loopback/common/models/role-mapping.js +0ms loopback:boot:compiler Found model "Role" - ../node_modules/loopback/common/models/role.json ../node_modules/loopback/common/models/role.js +1ms loopback:boot:compiler Found model "Scope" - ../node_modules/loopback/common/models/scope.json ../node_modules/loopback/common/models/scope.js +0ms loopback:boot:compiler Found model "User" - ../node_modules/loopback/common/models/user.json ../node_modules/loopback/common/models/user.js +0ms loopback:boot:compiler Skipping unknown module source dir "loopback/server/models" +0ms loopback:boot:compiler Found model "KnowBit" - ../common/models/know-bit.json ../common/models/know-bit.js +1ms loopback:boot:compiler Model source code not found: undefined - TypeError: Arguments to path.join must be strings +0ms loopback:boot:compiler Found model "User" - ../common/models/user.json (no source file) +0ms loopback:boot:compiler Skipping unknown module source dir "./models" +0ms loopback:boot:compiler Found model "ApplicationCredential" - ../node_modules/loopback-component-passport/lib/models/application-credential.json ../node_modules/loopback-component-passport/lib/models/application-credential.js +1ms loopback:boot:compiler Found model "UserCredential" - ../node_modules/loopback-component-passport/lib/models/user-credential.json ../node_modules/loopback-component-passport/lib/models/user-credential.js +0ms loopback:boot:compiler Found model "UserIdentity" - ../node_modules/loopback-component-passport/lib/models/user-identity.json ../node_modules/loopback-component-passport/lib/models/user-identity.js +0ms loopback:boot:compiler Using model "User" Configuration: {"dataSource":"db","public":true} Definition {"name":"User","plural":"users","base":"User","relations":{"accessTokens":{"type":"hasMany","model":"AccessToken","foreignKey":"userId"},"identities":{"type":"hasMany","model":"UserIdentity","foreignKey":"userId"},"credentials":{"type":"hasMany","model":"UserCredential","foreignKey":"userId"}},"validations":[],"acls":[],"methods":[]} +0ms loopback:boot:compiler Using model "UserCredential" Configuration: {"dataSource":"db","public":true} Definition {"name":"UserCredential","base":"PersistedModel","properties":{"provider":{"type":"String","comments":"facebook, google, twitter, linkedin"},"authScheme":{"type":"String","comments":"oAuth, oAuth 2.0, OpenID, OpenID Connect"},"externalId":{"type":"String","comments":"The provider specific id"},"profile":{"type":"Object"},"credentials":{"type":"Object"},"created":"Date","modified":"Date","id":{"id":1,"generated":true}},"acls":[{"principalType":"ROLE","principalId":"$everyone","permission":"DENY"},{"principalType":"ROLE","principalId":"$owner","permission":"ALLOW"}],"relations":{"user":{"type":"belongsTo","model":"User","foreignKey":"userId"}}} +1ms loopback:boot:compiler Using model "UserIdentity" Configuration: {"dataSource":"db","public":true} Definition {"name":"UserIdentity","plural":"UserIdentities","base":"PersistedModel","properties":{"provider":{"type":"String","comments":"facebook, google, twitter, linkedin"},"authScheme":{"type":"String","comments":"oAuth, oAuth 2.0, OpenID, OpenID Connect"},"externalId":{"type":"String","comments":"The provider specific id"},"profile":{"type":"Object"},"credentials":{"type":"Object"},"created":"Date","modified":"Date","id":{"id":1,"generated":true}},"acls":[{"principalType":"ROLE","principalId":"$everyone","permission":"DENY"},{"principalType":"ROLE","principalId":"$owner","permission":"ALLOW"}],"relations":{"user":{"type":"belongsTo","model":"User","foreignKey":"userId"}}} +0ms loopback:boot:compiler Using model "AccessToken" Configuration: {"dataSource":"db","public":false} Definition {"name":"AccessToken","properties":{"id":{"type":"string","id":true},"ttl":{"type":"number","ttl":true,"default":1209600,"description":"time to live in seconds (2 weeks by default)"},"created":{"type":"Date"}},"relations":{"user":{"type":"belongsTo","model":"User","foreignKey":"userId"}},"acls":[{"principalType":"ROLE","principalId":"$everyone","permission":"DENY"},{"principalType":"ROLE","principalId":"$everyone","property":"create","permission":"ALLOW"}]} +0ms loopback:boot:compiler Using model "ACL" Configuration: {"dataSource":"db","public":false} Definition {"name":"ACL","properties":{"model":{"type":"string","description":"The name of the model"},"property":{"type":"string","description":"The name of the property, method, scope, or relation"},"accessType":"string","permission":"string","principalType":"string","principalId":"string","id":{"id":1,"generated":true}}} +0ms loopback:boot:compiler Using model "RoleMapping" Configuration: {"dataSource":"db","public":false} Definition {"name":"RoleMapping","description":"Map principals to roles","properties":{"id":{"type":"string","id":true,"generated":true},"principalType":{"type":"string","description":"The principal type, such as user, application, or role"},"principalId":"string"},"relations":{"role":{"type":"belongsTo","model":"Role","foreignKey":"roleId"}}} +0ms loopback:boot:compiler Using model "Role" Configuration: {"dataSource":"db","public":false} Definition {"name":"Role","properties":{"id":{"type":"string","id":true,"generated":true},"name":{"type":"string","required":true},"description":"string","created":"date","modified":"date"},"relations":{"principals":{"type":"hasMany","model":"RoleMapping","foreignKey":"roleId"}}} +0ms loopback:boot:compiler Using model "KnowBit" Configuration: {"dataSource":"localpg","public":true} Definition {"name":"KnowBit","base":"PersistedModel","idInjection":true,"properties":{"label":{"type":"string","required":true},"link":{"type":"string","required":true}},"validations":[],"relations":{},"acls":[],"methods":[]} +0ms 

TL; DR

我已经指定了相同的string“用户”的名称和基本属性,以解决问题,我改名称值为小写“用户”

全文

好的,所以当我复制的

 loopback-example-passport/common/models/user.json 

文件我打错了,并设置名称='用户'而不是'用户'

这并没有解决最终的问题,但我认为这解释了循环依赖。 “基础”是这个模型的“基础”类,我也把它设置为“用户”

这使我能够通过模型编译阶段,但仍然没有configuration关系,从护照代码所需的“用户”到“用户身份”。

我认为我是在正确的轨道上,洞察力是在回环模型在strongloop / loopback-example-passport示例是覆盖内置的类与新的模型类的第一个字母的类名称是低于例如,userCredential是内置的模型类UserCredential等的覆盖,这在第一个有点混淆

 { "name": "userCredential", "plural": "userCredentials", "base": "UserCredential", ... 

但是我认为,如果我经过并检查我使用的是小写版本,那么事情可能会发生

这确实是个问题