0

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
      }
    })
  }
Barmar
  • 741,623
  • 53
  • 500
  • 612
Esam Olwan
  • 320
  • 1
  • 5
  • 16
  • `middleware.postCar` should be `middleware.postCar.bind(middleware)` or `(...args) => middleware.postCar(...args)` – Barmar Feb 01 '23 at 21:11

0 Answers0