Я делаю:
let con = mysql.createConnection({
host : conf.get('db').connection,
user : conf.get('db').user,
password : conf.get('db').pass,
database : conf.get('db').database
});
con.query('SELECT * FROM `clothing`', function(error, result, fields){
if(error == null){
var presets = [];
result.forEach(function(v, i){
presets.push({
'name': v.name,
'torso': [v.torso_draw, v.torso_tex],
'legs': [v.legs_draw, v.legs_tex],
'foot': [v.foot_draw, v.foot_tex],
'torso_acc': [v.torso_acc_draw, v.torso_acc_tex],
'hands': [v.hands_draw, v.hands_tex],
'helmet': [v.helmet_draw, v.helmet_tex],
'mask': [v.mask_draw, v.mask_tex]
});
});
response.json(presets);
} else{
console.log(error);
}
});
И мне дает ошибку что headers уже отправлены, хотя если после con.query() отправить response.json() то такой ошибки не будет. Пробовал return presets, но он тогда пишет undefined, просто не возвращаются. Если сделал console.log() то значения есть в presets, но как их юзеру отправить??
Я бы вынес работу с базой данных в отдельную функцию (а в идеале в отдельный модуль).
Как то так
const doQuery = callback => {
const connection = require('mysql').createConnection({
host: conf.get('db').connection,
user: conf.get('db').user,
password: conf.get('db').pass,
database: conf.get('db').database
});
const presets = [];
connection.connect();
connection.query('SELECT * FROM `clothing`', (err, results, fields) => {
if (err) return callback(err, null);
results.forEach((v, i) => {
presets.push({
'name': v.name,
'torso': [v.torso_draw, v.torso_tex],
'legs': [v.legs_draw, v.legs_tex],
'foot': [v.foot_draw, v.foot_tex],
'torso_acc': [v.torso_acc_draw, v.torso_acc_tex],
'hands': [v.hands_draw, v.hands_tex],
'helmet': [v.helmet_draw, v.helmet_tex],
'mask': [v.mask_draw, v.mask_tex]
});
});
connection.end();
callback(null, presets);
});
};
// вызов в app (в промышленном использовании следует добавить обработку ошибок)
doQuery((err, result) => response.json(presets));
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники