1

I am using Node.js with express, mysql, objection.js, and knex.js for my backend application. I want to refactor my code, especially connecting to database tables.

In legacy code I have a folder called models where I created various js files for each table:

models:
 |--catalog.js
 |--contacts.js
 |--menus.js
 |--products.js
 |-- etc

Each .js file has the following code (repeatedly):

const { Model } = require('objection');
const knex = require('../utils/db');

Model.knex(knex);

class Products extends Model {
  static get tableName() {
    return 'products'; // <-- Only name of the table differs
  }
}

module.exports = Products;

I wanted to avoid creating so many files for each table and wanted to do create a single model and create instances from it: Main.js (in models folder):

const { Model } = require('objection');
const knex = require('../utils/db');

Model.knex(knex);

class Main extends Model {
  constructor(name) {
    super();
    this.name = name;
  }

  static get tableName() {
    return this.name;
  }

}

module.exports = Main;

In controllers.js:

const Main = require('./main');

class Controllers {
  constructor() {
    this.admin = new Main('admins');
    this.catalog = new Main('catalog');
    this.products = new Main('products');
    this.contacts = new Main('contacts');
    this.inquiry = new Main('inquiry');
    this.menus = new Main('menus');
    this.news = new Main('news');
    this.refreshTokenAdmin = new Main('refresh-token-admin');
    this.rooms = new Main('rooms');
    this.sizes = new Main('sizes');
    this.itemSizes = new Main('item_sizes');
    this.slider = new Main('slider');
    this.users = new Main('users');
  }
}

module.exports = new Controllers();

When I run server I have this error:

Error: one of the identifier columns [id] is null or undefined. Have you specified the correct identifier column for the model 'Main' using the 'idColumn' property?
    at assertHasId (D:\Apps\SmartWebsite\node_modules\objection\lib\utils\assert.js:8:11)
    at InstanceFindOperation.onBuild (D:\Apps\SmartWebsite\node_modules\objection\lib\queryBuilder\operations\InstanceFindOperation.js:13:5)
    at QueryBuilder.callOperationMethod (D:\Apps\SmartWebsite\node_modules\objection\lib\queryBuilder\QueryBuilderOperationSupport.js:372:33)
    at D:\Apps\SmartWebsite\node_modules\objection\lib\queryBuilder\QueryBuilderOperationSupport.js:471:14
    at QueryBuilder.forEachOperation (D:\Apps\SmartWebsite\node_modules\objection\lib\queryBuilder\QueryBuilderOperationSupport.js:309:37)
    at QueryBuilder.executeOnBuild (D:\Apps\SmartWebsite\node_modules\objection\lib\queryBuilder\QueryBuilderOperationSupport.js:469:10)
    at callOnBuildHooks (D:\Apps\SmartWebsite\node_modules\objection\lib\queryBuilder\QueryBuilder.js:1209:11)
    at doExecute (D:\Apps\SmartWebsite\node_modules\objection\lib\queryBuilder\QueryBuilder.js:1086:13)
    at QueryBuilder.execute (D:\Apps\SmartWebsite\node_modules\objection\lib\queryBuilder\QueryBuilder.js:446:28)
    at processTicksAndRejections (node:internal/process/task_queues:96:5)
jkalandarov
  • 564
  • 5
  • 15

0 Answers0