Objection.js: getter on a model is being set when doing upsertGraphAndFetch

Created on 23 Jan 2019  路  4Comments  路  Source: Vincit/objection.js

after upgrading from 1.4.0 to 1.5.1 I got this in our functional test suite:

 TypeError: Cannot set property image_url of #<UserModelPublicGQLBase> which has only a getter

      753 |           }
      754 |         })
    > 755 |         existingUsers = await UserModel.query(trx).upsertGraphAndFetch(
          |                                                    ^
      756 |           usersToPatch,
      757 |           { insertMissing: false, update: true }
      758 |         )

      at setFast (node_modules/@capaj/objection/lib/model/modelSet.js:71:20)
      at UserModel.$set (node_modules/@capaj/objection/lib/model/Model.js:194:12)
      at setJson (node_modules/@capaj/objection/lib/model/modelSet.js:30:9)
      at UserModel.$setJson (node_modules/@capaj/objection/lib/model/Model.js:186:12)
      at Function.fromJson (node_modules/@capaj/objection/lib/model/Model.js:321:11)
      at Function.ensureModel (node_modules/@capaj/objection/lib/model/Model.js:583:25)
      at Function.ensureModelArray (node_modules/@capaj/objection/lib/model/Model.js:596:26)
      at new GraphUpsert (node_modules/@capaj/objection/lib/queryBuilder/graph/GraphUpsert.js:19:35)
      at UpsertGraphOperation.onAdd (node_modules/@capaj/objection/lib/queryBuilder/operations/UpsertGraphOperation.js:30:19)
      at UpsertGraphAndFetchOperation.onAdd (node_modules/@capaj/objection/lib/queryBuilder/operations/DelegateOperation.js:19:26)
      at SoftDeleteQueryBuilder.callOperationMethod (node_modules/@capaj/objection/lib/queryBuilder/QueryBuilderOperationSupport.js:359:33)
      at SoftDeleteQueryBuilder.addOperationUsingMethod (node_modules/@capaj/objection/lib/queryBuilder/QueryBuilderOperationSupport.js:395:28)
      at SoftDeleteQueryBuilder.addOperation (node_modules/@capaj/objection/lib/queryBuilder/QueryBuilderOperationSupport.js:386:22)
      at writeOperation (node_modules/@capaj/objection/lib/queryBuilder/QueryBuilder.js:904:19)
      at writeOperation (node_modules/@capaj/objection/lib/queryBuilder/QueryBuilder.js:1414:5)
      at SoftDeleteQueryBuilder.upsertGraphAndFetch (node_modules/@capaj/objection/lib/queryBuilder/QueryBuilder.js:895:12)
      at objection_1.transaction (back-end/src/models/OrganisationModel.ts:755:52)

getter is defined like this:

export default class UserModelPublicGQLBase extends TimestampedModel {
 get image_url(): string {
    ...
  }
}

I can omit the prop manually for now, so no rush on the fix. Anyway-awesome work with 1.5.1.

Most helpful comment

Actually I think this one could be fixed. Objection could avoid setting read-only getters at all. Now only getters that are listed in virtualAttributes are ignored.

All 4 comments

You get this because we added 'use strict' to every file. You can either remove the property or add it to the virtualAttributes list. I wouldn't say this is a bug.

Actually I think this one could be fixed. Objection could avoid setting read-only getters at all. Now only getters that are listed in virtualAttributes are ignored.

This is now fixed in 1.5.3

@koskimas I am afraid that with that change https://github.com/Vincit/objection.js/commit/a53400f0b56ed27f0746ac650082766d7c001ca3 - virtualAttributes are no longer considered at all

Was this page helpful?
0 / 5 - 0 ratings

Related issues

nazar picture nazar  路  3Comments

apronin83 picture apronin83  路  3Comments

bsdo64 picture bsdo64  路  3Comments

louis-etne picture louis-etne  路  4Comments

chen7david picture chen7david  路  3Comments