I have my middleware method postCar to add new cars to database from my Cars model
but I always get a TypeError where car is not defined as so TypeError: Cannot read properties of undefined (reading 'car')
app.js
// Tracker middleware
let middleware = new Middleware({
knex: knex,
})
// define router
const router = new Router()
router.post("/v1/cars", middleware.postCar, (ctx) => {
ctx.body = ctx.results
})
middleware.js
I do a validation schema before insertion, and if it passes, it calls the method Post from the Cars model. The validation passes and I get a value of true
for isValid
class Middleware {
constructor(params) {
this.knex = params.knex
this.car = new Cars(params)
}
async postCar(ctx, next) {
let params = ctx.request.body
// validation schema for car addition
let ajv = new Ajv({
removeAdditional: true,
allowUnionTypes: true
})
let _params = Object.assign({}, params)
const _validate = ajv.compile(CarInputSchema.postCars)
let isValid = _validate(_params)
// try-catch block to log errors
try {
if (!isValid) {
let e = new Error(errors.CAR_POST_VALIDATION_ERROR)
e.statusCode = 400
e.info = _validate.errors
return Promise.reject(e)
}
ctx.results = await this.car.post(_params)
await next()
} catch (err) {
console.error(err)
}
}
Cars.js
const tableName = 'cars'
class Cars {
constructor(params) {
this.knex = params.knex
}
/**
* Create car
* @param {Object<Cars>} car object
* @return {Promise<Cars>}
*/
post(car = {}) {
let self = this
// Schema validation and remove additional fields not in schema
let ajv = new Ajv({
removeAdditional: true,
allowUnionTypes: true
})
let _car = Object.assign({}, car)
const _validate = ajv.compile(CarSchema.post)
let isValid = _validate(_car)
if (!isValid) {
let e = new Error(error.CAR_POST_VALIDATION_ERROR)
e.statusCode = 400
e.info = _validate.errors
return Promise.reject(e)
}
// check if carPlate exist
let raw = self.knex.select().table(tableName).whereIn({
carPlate: _car.carPlate,
inactiveAt: null
}).limit(1).toSQL()
return self.knex.select(raw.sql, raw.bindings).then((result) => {
console.log(result)
// if carplate exist, reject the insertion
if (result[0].length > 0) {
let e = new Error(error.CAR_PLATE_EXIST_ERROR)
e.statusCode = 400
throw e
}
// insert carplate if there is no error
let raw = self.knex.insert(_car).into(tableName).toSQL()
return self.knex.raw(raw.sql, raw.bindings)
}).then((result) => {
return {
id: result[0].insertId,
..._car
}
})
}