nekrofxk
nekrofxk

Reputation: 61

ERR IS NOT DEFINED in node js

I'm trying a simple food ordering CRUD app wth node js, express js, and MySQL. when I'm trying to create a new order I'm getting an error. Can someone guide me because I'm new to node js. this is my code.

     var orderdb = {
            ordercreate: (req, res) => {
            var db = require('../db')

            if(error){
                console.log(error)
            } else{
            const query = ("INSERT INTO orders (order_id, product_id, product_name, customer_name, product_quantity, price, address_line1, address_line2, city, district, status, rest_id, customer_id) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
            db.query(query, [req.body.order_id, req.body.product_id, req.body.product_name, req.body.customer_name, 
                            req.body.product_quantity, req.body.price, req.body.address_line1, req.body.address_line2, 
                            req.body.city, req.body.district, req.body.status, req.body.rest_id, req.body.customer_id]);
            }   
       }  
}

Upvotes: 2

Views: 186

Answers (1)

num8er
num8er

Reputation: 19372

The issue is because of You're doing:

if (error) {

in scope where there is no such variable exists.

Also I see issues:

1) var db = require('../db'); inside request handler is bad practice

2) db.query does not have result handler, it should be handled with callback since it's async operation

So here is the fix:

const db = require('../db'); // moved outside, cause it should be defined once
var orderdb = {
    ordercreate: function (req, res) {
        const query = `
          INSERT INTO orders 
          (
           order_id, product_id, product_name, 
           customer_name, product_quantity, price, 
           address_line1, address_line2, city, district, 
           status, rest_id, customer_id
          ) 
          VALUES 
          (
           ?, ?, ?, 
           ?, ?, ?, 
           ?, ?, ?, ?, 
           ?, ?, ?
          )`;
        db.query(
          query,
          [
            req.body.order_id, req.body.product_id, req.body.product_name,
            req.body.customer_name, req.body.product_quantity, req.body.price,
            req.body.address_line1, req.body.address_line2, req.body.city, req.body.district,
            req.body.status, req.body.rest_id, req.body.customer_id
          ],
          (error, result) => {
            if (error) {
              return res.status(500).send({message: error.message});
            }
            res.status(201).send(result);
          });
    }
}

or using INSERT SET ? since field names and req.body attributes are same, mysql package will prepare query based on object that You pass as second argument:

const db = require('../db'); // moved outside, cause it should be defined once
const orderdb = {
  ordercreate: function (req, res) {
    db.query(
      'INSERT INTO orders SET ?',
      req.body,
      (error, result) => {
        if (error) {
          return res.status(500).send({message: error.message});
        }
        res.status(201).send(result);
      });
  }
}

take Your time and read manual here

P.S. Try to make Your code separated as modules for better maintainability.

for example

create controllers folder and put it as controllers/Orders.js file:

class OrdersController {
  constructor(components) {
    this._components = components || {};
  }

  get db() {
    return this._components.db;
  }

  create(req, res) {
    db.query(
      'INSERT INTO orders SET ?',
      req.body,
      (error, result) => {
        if (error) {
          return res.status(500).send({message: error.message});
        }
        res.status(201).send(result);
      });
  }
}

const db = require('../db');

module.exports = new OrdersController({db});

and in router:

const OrdersController = require('./controllers/Orders');

router.post(
  '/orders', 
  /* add validation or other middlewares */
  // here 
  OrdersController.create);

Upvotes: 1

Related Questions