I send requests using postman. And when I send request “POST” for create product (or another requests: GET, PUT , etc), I have problem:
JavaScript
x
2
1
UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'create' of undefined
2
I can’t figure out how I can send a query to my database to get this right.
I use express, sequelize and sequelize-cli, mysql2. And also i have migrations file.
My server.js
JavaScript
1
16
16
1
const express = require("express");
2
const productRouter = require("./routers/productRouter");
3
const discountRouter = require("./routers/discountRouter")
4
5
const app = express();
6
const PORT = process.env.PORT || 3000;
7
8
app.use(express.json());
9
10
// Запрос на таблицу с продуктами
11
app.use("/shop", productRouter);
12
// Запрос на таблицу со скидками
13
app.use("/shop", discountRouter);
14
15
app.listen(PORT, () => console.log("Server is working ... "));
16
productRouter.js
JavaScript
1
79
79
1
const Router = require("express");
2
const router = new Router();
3
const productController = require("../controllers/productControllers");
4
5
// Получаем все товары
6
router.get("/products", async (req, res, next) => {
7
const resultOfGetAllProducts = await productController.all();
8
if(resultOfGetAllProducts === Error) {
9
return res.sendStatus(500).json(Error);
10
} else {
11
return res.sendStatus(200).json(resultOfGetAllProducts);
12
};
13
});
14
15
// Получаем конкретный товар
16
router.get("/product/:id", async (req, res, next) => {
17
if(!req.params.id) return res.sendStatus(400).send("Product ID is not specified.");
18
const id = req.params.id;
19
const result = null;
20
const resultOfGetOneProduct = await productController.one(id, result);
21
if(resultOfGetOneProduct === Error) {
22
return res.sendStatus(500).json(Error);
23
} else {
24
return res.sendStatus(200).json(resultOfGetOneProduct);
25
};
26
});
27
28
// Добавляем товар
29
router.post("/product", async (req, res, next) => {
30
if(!req.body) return res.sendStatus(400).send("Product parameters are not specified.");
31
const product = {
32
product_name: req.body.product_name,
33
price: req.body.price,
34
product_description: req.body.product_description
35
};
36
const result = null;
37
const resultOfCreateProduct = await productController.create(product, result);
38
if (resultOfCreateProduct === Error) {
39
return res.sendStatus(500).json(Error);
40
} else {
41
return res.sendStatus(200).send("The product has been created.");
42
}
43
});
44
45
// Обновляем товар
46
router.put("/product/:id", async (req, res, next) => {
47
if(!req.params.id) return res.sendStatus(400).send("Product ID is not specified.");
48
if(!req.body) return res.sendStatus(400).send("Product parameters are not specified.");
49
const product = {
50
product_name: req.body.product_name,
51
price: req.body.price,
52
product_description: req.body.product_description
53
}
54
const id = {id: req.params.id};
55
const result = null;
56
const resultOfUpdateProduct = await productController.update(id, product, result);
57
if(resultOfUpdateProduct === Error) {
58
return res.sendStatus(500).json(Error);
59
} else {
60
return res.sendStatus(200).send("The product has been updated.");
61
};
62
});
63
64
// Удаляем товар
65
router.delete("/product/:id", async (req, res, next) => {
66
if(!req.params.id) return res.sendStatus(400).send("Product ID is not specified.");
67
const id = {id: req.params.id};
68
const result = null;
69
const resultOfDeleteProduct = await productController.delete(id, result);
70
if(resultOfDeleteProduct === Error) {
71
return res.sendStatus(500).json(Error);
72
} else {
73
return res.sendStatus(200).send("The product has been deleted.");
74
}
75
});
76
77
78
module.exports = router;
79
productController.js
JavaScript
1
79
79
1
const Router = require("express");
2
const router = new Router();
3
const productController = require("../controllers/productControllers");
4
5
// Получаем все товары
6
router.get("/products", async (req, res, next) => {
7
const resultOfGetAllProducts = await productController.all();
8
if(resultOfGetAllProducts === Error) {
9
return res.sendStatus(500).json(Error);
10
} else {
11
return res.sendStatus(200).json(resultOfGetAllProducts);
12
};
13
});
14
15
// Получаем конкретный товар
16
router.get("/product/:id", async (req, res, next) => {
17
if(!req.params.id) return res.sendStatus(400).send("Product ID is not specified.");
18
const id = req.params.id;
19
const result = null;
20
const resultOfGetOneProduct = await productController.one(id, result);
21
if(resultOfGetOneProduct === Error) {
22
return res.sendStatus(500).json(Error);
23
} else {
24
return res.sendStatus(200).json(resultOfGetOneProduct);
25
};
26
});
27
28
// Добавляем товар
29
router.post("/product", async (req, res, next) => {
30
if(!req.body) return res.sendStatus(400).send("Product parameters are not specified.");
31
const product = {
32
product_name: req.body.product_name,
33
price: req.body.price,
34
product_description: req.body.product_description
35
};
36
const result = null;
37
const resultOfCreateProduct = await productController.create(product, result);
38
if (resultOfCreateProduct === Error) {
39
return res.sendStatus(500).json(Error);
40
} else {
41
return res.sendStatus(200).send("The product has been created.");
42
}
43
});
44
45
// Обновляем товар
46
router.put("/product/:id", async (req, res, next) => {
47
if(!req.params.id) return res.sendStatus(400).send("Product ID is not specified.");
48
if(!req.body) return res.sendStatus(400).send("Product parameters are not specified.");
49
const product = {
50
product_name: req.body.product_name,
51
price: req.body.price,
52
product_description: req.body.product_description
53
}
54
const id = {id: req.params.id};
55
const result = null;
56
const resultOfUpdateProduct = await productController.update(id, product, result);
57
if(resultOfUpdateProduct === Error) {
58
return res.sendStatus(500).json(Error);
59
} else {
60
return res.sendStatus(200).send("The product has been updated.");
61
};
62
});
63
64
// Удаляем товар
65
router.delete("/product/:id", async (req, res, next) => {
66
if(!req.params.id) return res.sendStatus(400).send("Product ID is not specified.");
67
const id = {id: req.params.id};
68
const result = null;
69
const resultOfDeleteProduct = await productController.delete(id, result);
70
if(resultOfDeleteProduct === Error) {
71
return res.sendStatus(500).json(Error);
72
} else {
73
return res.sendStatus(200).send("The product has been deleted.");
74
}
75
});
76
77
78
module.exports = router;
79
productModels.js
JavaScript
1
70
70
1
const Sequelize = require("sequelize");
2
const productsModel = require("../models/products.js");
3
const db = require("../models/index.js");
4
5
// Получаю с бд все продукты
6
exports.all = async function getProducts(cb) {
7
//const products = await db.query('SELECT * FROM products');
8
const products = await db.findAll({raw: true});
9
if(products === null) {
10
return cb(Error, null);
11
} else {
12
return cb(null, products);
13
};
14
};
15
16
// Получаю с бд конкретный продукт
17
exports.one = async function getOneProduct(id, cb) {
18
//const getOneQuery = 'SELECT * FROM product where id = $1';
19
//const getDiscount = 'SELECT * FROM discounts where product_id = $1';
20
//const curDiscount = await Discount.findOne({where: id});
21
const product = await db.findAll({where: {id: id}});
22
const productDiscount = await Discount.findAll({where: {product_id: id}});
23
const priceWithDiscount = product.price - (product.price * ((productDiscount.discount)/100));
24
if (product === null) {
25
return cb(Error, null);
26
} else if(productDiscount === null) {
27
return cb(null, product)
28
} else {
29
product.price = priceWithDiscount;
30
const result = product;
31
return cb(null, result);
32
};
33
};
34
35
// Создаю в бд продукт
36
exports.create = async function createProduct(product, cb) {
37
// const createQuery = 'INSERT INTO product (product_name, price, product_description) values ($1, $2, $3) RETURNING *';
38
// const arrayQuery = [product.product_name, product.price, product.product_description];
39
// const newProduct = await db.query(createQuery, arrayQuery);
40
const newProduct = await db.productsModel.create(product);
41
if(newProduct === null) {
42
return cb(Error, null);
43
} else {
44
return cb(null, newProduct);
45
};
46
};
47
48
// Обновляю в бд конкретный продукт
49
exports.update = async function updateProduct(id, newData, cb) {
50
// const updateQuery = 'UPDATE product set product_name = $1, price = $2, product_description = $3 where id = $4 RETURNING *';
51
// const arrayQuery = [newData.product_name, newData.price, newData.product_description, id];
52
const product = await db.update(newData, {where: id});
53
if(product === null) {
54
return cb(Error, null);
55
} else {
56
return cb(null, product);
57
};
58
};
59
60
// Удаляю в бд конкретный продукт
61
exports.delete = async function deleteProduct(id, cb) {
62
//const deleteQuery = 'DELETE FROM product where id = $1';
63
const product = await db.destroy({where: id});
64
if(product === null) {
65
return cb(Error, null);
66
} else {
67
return cb(null, product);
68
};
69
};
70
product.js
JavaScript
1
35
35
1
'use strict';
2
const {
3
Model
4
} = require('sequelize');
5
module.exports = (sequelize, DataTypes) => {
6
class products extends Model {
7
/**
8
* Helper method for defining associations.
9
* This method is not a part of Sequelize lifecycle.
10
* The `models/index` file will call this method automatically.
11
*/
12
static associate(models) {
13
// define association here
14
}
15
16
static async addProduct (params) {
17
await this.findOrCreate(
18
{where: {
19
product_name: params.product_name,
20
price: params.price,
21
product_description: params.product_description
22
}});
23
}
24
};
25
products.init({
26
product_name: DataTypes.STRING,
27
price: DataTypes.NUMBER,
28
product_description: DataTypes.STRING
29
}, {
30
sequelize,
31
modelName: 'products',
32
});
33
return products;
34
};
35
index.js
JavaScript
1
38
38
1
'use strict';
2
3
const fs = require('fs');
4
const path = require('path');
5
const Sequelize = require('sequelize');
6
const basename = path.basename(__filename);
7
const env = process.env.NODE_ENV || 'development';
8
const config = require(__dirname + '/../config/config.json')[env];
9
const db = {};
10
11
let sequelize;
12
if (config.use_env_variable) {
13
sequelize = new Sequelize(process.env[config.use_env_variable], config);
14
} else {
15
sequelize = new Sequelize(config.database, config.username, config.password, config);
16
}
17
18
fs
19
.readdirSync(__dirname)
20
.filter(file => {
21
return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js');
22
})
23
.forEach(file => {
24
const model = require(path.join(__dirname, file))(sequelize, Sequelize.DataTypes);
25
db[model.name] = model;
26
});
27
28
Object.keys(db).forEach(modelName => {
29
if (db[modelName].associate) {
30
db[modelName].associate(db);
31
}
32
});
33
34
db.sequelize = sequelize;
35
db.Sequelize = Sequelize;
36
37
module.exports = db;
38
Advertisement
Answer
Change in productModels.js
the function createProduct to:
JavaScript
1
11
11
1
// Создаю в бд продукт
2
exports.create = async function createProduct(product, cb) {
3
const newProduct = await db['products'].create(product); // db['modelName'], in your case is products, check your model
4
// or, const newProduct = await db.products.create(product)
5
if(newProduct === null) {
6
return cb(new Error('Product empty'), null);
7
} else {
8
return cb(null, newProduct);
9
};
10
};
11
And do the same to other functions.
Here your model name in
products.js
:
JavaScript
1
8
1
2
}, {
3
sequelize,
4
modelName: 'products',
5
});
6
return products;
7
8