Я пытаюсь встроить в свой NodeJS API помощник для запросов, поэтому мне не нужно будет писать всегда или почти всегда одни и те же запросы, просто меняющиеся как имя таблицы, значения и параметры. Я использую PG без ORM в качестве упражнения для SQL запросов.
Я пытаюсь создать универсальный помощник INSERT, подобный следующему
insertOne(table, values, params) {
const arr1 = [...values];
const arr2 = [...params];
return query(`INSERT INTO ${table}
(${arr1})
VALUES ($1, $2, $3, $4, $5, $6)
RETURNING*`, [arr2]);
}
Я пытался сделать так, но получаю сообщение об ошибке:
"bind message supplies 1 parameters, but prepared statement "" requires 6"
То, чего я хочу добиться, - это иметь возможность вставлять в вызов БД, когда мне нужен этот метод, для замены используемого мной сейчас nex-запроса:
async createOne(req, res) {
console.log({ ...req.body });
try {
const product = await query(
`INSERT INTO products
(productname, description, brand, price, category, imageurl)
VALUES ($1, $2, $3, $4, $5, $6)
RETURNING*`,
[
req.body.productname,
req.body.description,
req.body.brand,
req.body.price,
req.body.category,
req.body.imageurl
]
);
res.json({ msg: "Product added", data: product.rows });
} catch (err) {
return res.json({ msg: "POST Something went wrong!", err: err });
}
}
Я хотел бы иметь возможность заменить то, что выше, помощником, передающим значения и параметры в качестве аргументов при вызове метода. Но я застрял и мне нужна помощь, чтобы все заработало.
[РЕДАКТИРОВАТЬ] Добавление помощника, как требуется, комментируя весь файл:
const { query } = require("../db/dbConnect");
const Queries = {
findAll(table) {
return query(`SELECT * FROM ${table}`);
},
findOne(table, id, params) {
return query(`SELECT * FROM ${table} where ${id} = $1`, [params]);
},
insertOne(table, values, params) {
const arr1 = [...values];
const arr2 = [params];
return query(
`INSERT INTO ${table}
(${arr1})
VALUES ($1, $2, $3, $4, $5, $6)
RETURNING*`, [arr2]
);
}
};
module.exports = { Queries };
И вставка одного вызова
async createOne(req, res) {
console.log({ ...req.body });
try {
const product = await Queries.insertOne(
"products",
[
"productname",
"description",
"brand",
"price",
"category",
"imageurl"
],
[
req.body.productname,
req.body.description,
req.body.brand,
req.body.price,
req.body.category,
req.body.imageurl
]
);
res.json({ msg: "Product added", data: product.rows });
} catch (err) {
return res.json({ msg: "POST Something went wrong!", err: err });
}
},