首页 > 解决方案 > addToCollection() 不适用于我创建的模型,但适用于预构建的“用户”模型

问题描述

当我使用 OrganisationalUnit 模型await OrganisationalUnit.addToCollection(id,'users',userIds); 我收到一个错误

TypeError: OrganisationalUnit.addToCollection is not a function
    at Object.fn (/var/www/html/prime/api/controllers/organisational-units/add-users-to-unit.js:38:30)

但是,当我使用具有相同参数的用户模型时(仅用于测试)

await User.addToCollection(id,'units',userIds); //it saves perfectly!

然后我尝试打印模型本身并且有区别:

console.log(OrganisationalUnit) //prints 

{ attributes:
   { name: { type: 'string', required: true, autoMigrations: [Object] },
     location: { type: 'string', autoMigrations: [Object] },
     parent: { model: 'OrganisationalUnit', autoMigrations: [Object] },
     users:
      { collection: 'User',
        via: 'units',
        description: 'the units this user manages' } },
  identity: 'organisationalunit',
  globalId: 'OrganisationalUnit' }

console.log(User) //prints



newConstructor {
  _adapter:
   { identity: 'sails-mongo',
     adapterApiVersion: 1,
     defaults: { schema: false },
     datastores: { default: [Object] },
     mongodb:
      { [Function]
        MongoError: [Function: MongoError],
        MongoNetworkError: [Function: MongoNetworkError],
        MongoTimeoutError: [Function: MongoTimeoutError],
        MongoServerSelectionError: [Function: MongoServerSelectionError],
        MongoParseError: [Function: MongoParseError],
        MongoWriteConcernError: [Function: MongoWriteConcernError],
        MongoBulkWriteError: [Function: BulkWriteError],
        BulkWriteError: [Function: BulkWriteError],
        Admin: [Function: Admin],
        MongoClient: [Function],
        Db: [Function],
        Collection: [Function: Collection],
        Server: [Function: Server],
        ReplSet: [Function: ReplSet],
        Mongos: [Function: Mongos],
        ReadPreference: [Function],
        GridStore: [Function],
        Chunk: [Function],
        Logger: [Function],
        AggregationCursor: [Function: AggregationCursor],
        CommandCursor: [Function: CommandCursor],
        Cursor: [Function: Cursor],
        GridFSBucket: [Function],
        CoreServer: [Function],
        CoreConnection: [Function: Connection],
        Binary: [Function],
        Code: [Function],
        Map: [Function],
        DBRef: [Function],
        Double: [Function],
        Int32: [Function],
        Long: [Function],
        MinKey: [Function],
        MaxKey: [Function],
        ObjectID: [Function],
        ObjectId: [Function],
        Symbol: [Function],
        Timestamp: [Function],
        BSONRegExp: [Function],
        Decimal128: [Function],
        connect: [Circular],
        instrument: [Function] },
     registerDatastore: [Function: registerDatastore],
     teardown: [Function: teardown],
     createManager:
      { friendlyName: 'Create manager',
        description:
         'Build and initialize a connection manager instance (in Mongo, this is `db`).',
        moreInfoUrl:
         'https://github.com/node-machine/driver-interface/blob/master/machines/create-manager.js',
        inputs: [Object],
        exits: [Object],
        fn: [Function: fn],
        identity: 'create-manager',
        implementationType: 'analog' },
     destroyManager:
      { friendlyName: 'Destroy manager',
        description:
         'Destroy the specified connection manager and all of its active connections.',
        extendedDescription:
         'This may involve destroying a pool and its connections, destroying multiple pools and their connections, doing nothing at all (if this manager just does ad-hoc connections), or something even more exotic.  The implementation is left up to the driver.',
        sync: true,
        inputs: [Object],
        exits: [Object],
        fn: [Function: fn],
        identity: 'destroy-manager',
        implementationType: 'analog' },
     getConnection:
      { friendlyName: 'Get connection',
        description:
         'Get an active connection to the database (in Mongo, this is currently a no-op).',
        moreInfoUrl:
         'https://github.com/node-machine/driver-interface/blob/master/machines/get-connection.js',
        sync: true,
        inputs: [Object],
        exits: [Object],
        fn: [Function: fn],
        identity: 'get-connection',
        implementationType: 'analog' },
     releaseConnection:
      { friendlyName: 'Release connection',
        description: 'Release an active database connection.',
        extendedDescription:
         'Depending on the implementation of this driver, this might release the connection back into the pool or close it entirely.  Regardless, if the provided connection has a transaction started, be sure to end the transaction by either committing it or rolling it back before releasing the connection.',
        sync: true,
        inputs: [Object],
        exits: [Object],
        fn: [Function: fn],
        identity: 'release-connection',
        implementationType: 'analog' },
     verifyModelDef:
      { friendlyName: 'Verify model def',
        description:
         'Verify that the specified model definition is compatible with this adapter.',
        extendedDescription:
         'This assumes that the provided model def has already undergone adapter-agnostic normalization, and is considered generally valid.',
        sideEffects: 'cacheable',
        sync: true,
        inputs: [Object],
        exits: [Object],
        fn: [Function: fn],
        identity: 'verify-model-def',
        implementationType: 'analog' },
     create: [Function],
     createEach: [Function],
     update: [Function],
     destroy: [Function],
     find: [Function],
     count: [Function],
     sum: [Function],
     avg: [Function],
     define: [Function: define],
     drop: [Function: drop],
     definePhysicalModel:
      { friendlyName: 'Define (physical model)',
        description:
         'Define a physical model (i.e. Mongo collection) with the specified characteristics, creating indexes as needed.',
        sideEffects: 'idempotent',
        inputs: [Object],
        exits: [Object],
        fn: [Function: fn],
        identity: 'define-physical-model',
        implementationType: 'analog' },
     dropPhysicalModel:
      { friendlyName: 'Drop (physical model)',
        description:
         'Completely drop & destroy any traces of a particular physical model (i.e. Mongo collection).',
        sideEffects: 'idempotent',
        inputs: [Object],
        exits: [Object],
        fn: [Function: fn],
        identity: 'drop-physical-model',
        implementationType: 'analog' },
     setPhysicalSequence:
      { friendlyName: 'Set physical sequence',
        description: 'Reset a auto-incrementing sequence to the specified value.',
        sideEffects: 'idempotent',
        inputs: [Object],
        exits: [Object],
        fn: [Function: fn],
        identity: 'set-physical-sequence',
        implementationType: 'analog' } },
  _orm:
   { collections:
      { organisationalunit: [newConstructor],
        user: [Circular],
        archive: [newConstructor],
        organisationalunit_users__user_units: [newConstructor] },
     datastores: {} },
  waterline:
   { collections:
      { organisationalunit: [newConstructor],
        user: [Circular],
        archive: [newConstructor],
        organisationalunit_users__user_units: [newConstructor] },
     datastores: {} },
  _callbacks: {},
  hasSchema: true,
  _transformer:
   { _transformations:
      { createdAt: 'createdAt',
        updatedAt: 'updatedAt',
        id: '_id',
        emailAddress: 'emailAddress',
        emailStatus: 'emailStatus',
        emailChangeCandidate: 'emailChangeCandidate',
        password: 'password',
        fullName: 'fullName',
        isSuperAdmin: 'isSuperAdmin',
        passwordResetToken: 'passwordResetToken',
        passwordResetTokenExpiresAt: 'passwordResetTokenExpiresAt',
        emailProofToken: 'emailProofToken',
        emailProofTokenExpiresAt: 'emailProofTokenExpiresAt',
        stripeCustomerId: 'stripeCustomerId',
        hasBillingCard: 'hasBillingCard',
        billingCardBrand: 'billingCardBrand',
        billingCardLast4: 'billingCardLast4',
        billingCardExpMonth: 'billingCardExpMonth',
        billingCardExpYear: 'billingCardExpYear',
        tosAcceptedByIp: 'tosAcceptedByIp',
        lastSeenAt: 'lastSeenAt' } },
  associations:
   [ { alias: 'units',
       type: 'collection',
       collection: 'organisationalunit',
       via: 'users' } ],
  publish: [Function: wrapper],
  subscribe: [Function: wrapper],
  unsubscribe: [Function: wrapper],
  getRoomName: [Function: getRoomName],
  _publishRPS: [Function: _publishRPS],
  _room: [Function: wrapper],
  _classRoom: [Function: _classRoom],
  _publishUpdate: [Function: wrapper],
  _publishDestroy: [Function: wrapper],
  _publishAdd: [Function: wrapper],
  _publishRemove: [Function: wrapper],
  _publishCreate: [Function: wrapper],
  _publishCreateSingle: [Function: _publishCreateSingle],
  _watch: [Function: wrapper],
  _introduce: [Function: wrapper],
  _retire: [Function: wrapper],
  autosubscribe: true }

请帮助我是 SailsJs 的新手

标签: sails.js

解决方案


推荐阅读