Express Js Soru
-
Şimdi klasik bir sıralı işlem yapan dilden geçen birisiyim async kavramını az çok anladım ama uyarlayamadım.
Yapmak istediğim şu:
3 tane sql sorgum var sırasıyla çalıştırmak istiyorum yani misalen başta sayıyı kontrol ediyorum sonra insert edip tekrar sayıyı kontrol edip 10 dan büyükse işlem yapmak istiyorum gibi then kullanmayı denedim ya then olmuyor ya ben beceremedim. await desen ayrı bir saçma durdu.
Şuanki çıktım bu şekil

Kod şu şekil:
function DB_Select(Query){ connection.query(Query, (err, rows) => { if (err) throw err; console.log("All Rows Inserted",rows[0].sayi); return rows; }); } function DB_All(Query,data) { connection.query(Query, [data], (err, rows) => { if (err) throw err; console.log("All Rows Inserted"); }); return true; } app.post("/api/test", (req, res, next) => { console.log('Got body:', req.body); var scanner_id = req.body.root[0].mac console.log(scanner_id) var data = []; for(var gelen_data in req.body.root){ if(req.body.root[gelen_data].mac != scanner_id){ data.push([req.body.root[gelen_data].mac,scanner_id]) } } console.log(data); var query = `INSERT INTO temp (card_no, scanner_no) VALUES ?;`; var query_temp_count = `SELECT COUNT(*) AS sayi FROM temp`; console.log(DB_Select(query_temp_count)); console.log(DB_All(query,data)); console.log(DB_Select(query_temp_count)); res.send({ message: `Basarili` }); }); -
Nodejs de mysql işlemi yapan hiç olmadı mı
-
function DB_All(Query,data) { connection.query(Query, [data], (err, rows) => { if (err) throw err; console.log("All Rows Inserted"); }); return true; }js bilgim cok iyi degil yanlissam duzeltir birisi ama :
burada ustteki query yi bitirmeyi beklemeden alttaki returne gelecegini biliyon di mi ?
connection.query().then() gibi bisey yapman lazim
-
yolbulucu bunu yazdı
function DB_All(Query,data) { connection.query(Query, [data], (err, rows) => { if (err) throw err; console.log("All Rows Inserted"); }); return true; }js bilgim cok iyi degil yanlissam duzeltir birisi ama :
burada ustteki query yi bitirmeyi beklemeden alttaki returne gelecegini biliyon di mi ?
connection.query().then() gibi bisey yapman lazim
Evet hocam biliyorum .then yapınca sanki çok saçma bir hal aldı 3 tane then her şey iç içe girdi o returnler ne yapmak istediğimi göstermek için
-
function DB_Select(Query){ return new Promise((resolve, reject) => { connection.query(Query, (err, rows) => { if (err) reject(err); console.log("All Rows Inserted",rows[0].sayi); reesolve(rows); }); }); } function DB_All(Query,data) { return new Promise((resolve, reject) => { connection.query(Query, [data], (err, rows) => { if (err) reject(err); console.log("All Rows Inserted"); resolve(true); }); }); } app.post("/api/test", async (req, res, next) => { console.log('Got body:', req.body); var scanner_id = req.body.root[0].mac console.log(scanner_id) var data = []; for(var gelen_data in req.body.root){ if(req.body.root[gelen_data].mac != scanner_id){ data.push([req.body.root[gelen_data].mac,scanner_id]) } } console.log(data); var query = `INSERT INTO temp (card_no, scanner_no) VALUES ?;`; var query_temp_count = `SELECT COUNT(*) AS sayi FROM temp`; console.log(await DB_Select(query_temp_count)); console.log(await DB_All(query,data)); console.log(await DB_Select(query_temp_count)); res.send({ message: `Basarili` }); });Native nodejs mysql de promise dönüş olmadığı için direk await ya da then kullanamazsınız. Bunun yerine fonksiyonların dönüşlerini promise olarak yapıp kullanılacak fonksiyonda await ile beklemesini sağlayabilirsiniz. Ya da zincirleme yapacaksanız .then ile iç içe kullanabilirsiniz. Ama bu durumda böyle kullanman yeterli olur.
Yol yakınken native mysql'den vazgeç derim hocam, en azından mysql2 kullan ya da orm olayına geç derim. Sequelize idealdir, bir sefer model yapısını ayarlarsın kafan rahat olur.
-
@antichrist guzel aciklamis olayi.
Ya kendin bi promise wrapper yazacaksin ki await/then ile kullanabilesin, ya da knex, mysql2 veya sequelize kullanacaksin.
-
Hocam NodeJS ile karar kıldı isen bence typescript ile başla ve nest.js öğren backend için. Çatır çutur kod yazarsın ve typesafe ilerlersin.
-
MhmdAlmz bunu yazdı
Hocam NodeJS ile karar kıldı isen bence typescript ile başla ve nest.js öğren backend için. Çatır çutur kod yazarsın ve typesafe ilerlersin.
NodeJs zaten ilgimi çekiyordu biraz mecburiyetten girdim sayılabilir seri api yazmam lazımdı nodejs tercih ettim ama 1 kez girmiş bulundum devam ederim typescript bakacam not aldım
Mysql2 deniyorum şimdi
-
const Pool = require('pg').Pool var format = require('pg-format'); app.use(bodyParser.urlencoded({ extended: true })); app.use(bodyParser.json()); app.use(bodyParser.raw()); const pool = new Pool({ user : 'postgres', host : 'localhost', database : 'beacon', password : 'root', port : 5432 }) app.post("/api/test", (req, response, next) => { var scanner_id = req.body.root[0].mac var data = []; for(var gelen_data in req.body.root){ if(req.body.root[gelen_data].mac != scanner_id){ //data += "('" + req.body.root[gelen_data].mac +"','"+ scanner_id +"')," data.push([req.body.root[gelen_data].mac,scanner_id]) } } pool.query(format('INSERT INTO temp (card_id,scanner_id) VALUES %L',data) ).then(() => { pool.query('SELECT COUNT(*) as sayi FROM temp').then(res => { if (res.rows[0].sayi > 15){ console.log('Temizlenecek') } response.status(200).json(res.rows) }).catch(err =>{ response.status(400).json({message:"Hata1" + err}) }) }).catch(err => { response.status(400).json({message:"Hata2" + err}) }); })Postgres'e geçince çatır çatır temiz oldu. Bilgili hocalarımız kontrol edebilirse then catch yapısı tam oturmuş mu diye yoksa tek catch ile işi bitirebilir miydik. Şuan isteğimi karşılıyor sadece daha iyisi nasıl yapılır diye merak ediyorum
TheAvenqer tarafından 15/Kas/21 00:04 tarihinde düzenlenmiştir -
TheAvenqer bunu yazdı
const Pool = require('pg').Pool var format = require('pg-format'); app.use(bodyParser.urlencoded({ extended: true })); app.use(bodyParser.json()); app.use(bodyParser.raw()); const pool = new Pool({ user : 'postgres', host : 'localhost', database : 'beacon', password : 'root', port : 5432 }) app.post("/api/test", (req, response, next) => { var scanner_id = req.body.root[0].mac var data = []; for(var gelen_data in req.body.root){ if(req.body.root[gelen_data].mac != scanner_id){ //data += "('" + req.body.root[gelen_data].mac +"','"+ scanner_id +"')," data.push([req.body.root[gelen_data].mac,scanner_id]) } } pool.query(format('INSERT INTO temp (card_id,scanner_id) VALUES %L',data) ).then(() => { pool.query('SELECT COUNT(*) as sayi FROM temp').then(res => { if (res.rows[0].sayi > 15){ console.log('Temizlenecek') } response.status(200).json(res.rows) }).catch(err =>{ response.status(400).json({message:"Hata1" + err}) }) }).catch(err => { response.status(400).json({message:"Hata2" + err}) }); })Postgres'e geçince çatır çatır temiz oldu. Bilgili hocalarımız kontrol edebilirse then catch yapısı tam oturmuş mu diye yoksa tek catch ile işi bitirebilir miydik. Şuan isteğimi karşılıyor sadece daha iyisi nasıl yapılır diye merak ediyorum
Hocam yol yakınken callback hell problemini araştır. Bugün işini çözersin ama 1 ay sonra 3 aylık ekstra eforun çıkar :)
