Reputation: 61
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
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