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)