#javascript #mysql #node.js #database #express
#javascript #mysql #node.js #База данных #экспресс
Вопрос:
Не удается установить заголовки после их отправки клиенту, я получаю эту ошибку. Я провел некоторое исследование, и я думаю, что это из-за более чем одного обратного вызова, но я не могу решить эту проблему. Пожалуйста, помогите мне исправить эту проблему. Я прилагаю к настоящему мой routes.js код. Любая помощь будет очень ценной. Спасибо.
Вот мой routes.js код
const {
con,g
sessionStore
} = require('./config/db');
const { route } = require('./routes/auth');
exports.new = function(req, res){
message = '';
if(req.method == "POST"){
const post = req.body;
const username= post.username;
const title= post.title;
const state= post.state;
const category= post.category;
const description= post.description;
if (!req.files)
return res.status(400).send('No files were uploaded.');
const file = req.files.uploaded_image;
var img_name=file.name;
if(file.mimetype == "image/jpeg" ||file.mimetype == "image/png"||file.mimetype == "image/gif" ){
file.mv('public/imgs/uploads/' file.name, function(err) {
var sql = "INSERT INTO `nt_data`(`username`,`title`,`state`,`category`, `images` ,`description`) VALUES (?,?,?,?,?,?)";
var query = con.query(sql, [username, title, state, category, img_name, description], function(err) {
console.log(err)
if (!err) {
res.redirect('show/' username);
}
else {
message = "This format is not allowed , please upload file with '.png','.gif','.jpg'";
res.render('new.ejs',{message: message});
}
});
});
}
}
else {
res.render('new');
}
};
exports.show = function(req, res){
let message = '';
var username = req.params.username;
const sql="SELECT * FROM `nt_data` WHERE `username`='" username "'";
con.query(sql, function(err, result){
console.log(err)
if(result.length <= 0){
message = "show not found!";
res.render('show.ejs',{data:result, message: message});
}else{
res.redirect('/places');
}
res.render('show', {data:result, message: message});
});
};
exports.places=function (req,res){
let message = '';
var username = req.params.username;
const sql="SELECT * FROM `nt_data` WHERE `username`='" username "'";
con.query(sql, function(err, result){
console.log(err)
if(result.length <= 0)
message = "places not found!";
res.render('places.ejs',{data:result, message: message});
});
}
Комментарии:
1. Вам нужно преобразовать все вызовы функций с обратными вызовами в асинхронную функцию с.
Promise
Таким образом, ваш код будет более последовательным, и вы легко устраните свою проблему. И избегайте внедрения SQL, вставляя пользовательский ввод в SQL-запрос путем объединения строк. Узнайте, как использовать параметры запроса.
Ответ №1:
В вашей функции show вы выполняете запрос к базе данных, внутри обратного вызова у вас есть оператор if else с res.render и res.redirect . Таким образом, так или иначе отправляется результат. Таким образом, вы не можете отправить результат, когда оператор if завершен. Удалите это res.render('show', {data:result, message: message});
. строка, и все готово!
Комментарии:
1. Я удалил res.render(‘show’, {data:result, message: message}); сообщение, написанное после части if else , но при его удалении новый файл.ejs напрямую перенаправляет на places.ejs вместо перенаправления на страницу show.ejs
2. Из-за этого только я добавил туда res.render
3. Это потому, что ваш запрос, вероятно, не дает результатов. Я думаю, что это была проблема в вашем другом вопросе?
4. да, но я могу вставлять данные в базу данных.
5. Ах, я думаю, что наконец-то вижу это. В sql вы не можете использовать равный sing: = Вы должны использовать LIKE .
SELECT * FROM nt_data` WHERE username LIKE' " username "'
. И не используйте переменную в такой строке. Используйте его так же, как вы делали в своей новой функцииSELECT * FROM nt_data` WHERE username LIKE ?", [username]