slevinkelevra Δημοσ. 7 Σεπτεμβρίου 2013 Δημοσ. 7 Σεπτεμβρίου 2013 Μπορει να εχει να κανει με websockets, αλλα το προβλημα ειναι στο query , ριξτε μια ματια ρε παιδια please, γιατι δε μπορω να βγαλω ακρη. Χρησιμοποιω websockets, nodejs 0.10.12 και node-postgre module 2.2.0 για να στειλω δεδομενα απο σερβερ σε client. Ο σερβερ περνει δεδομενα απο τον πελατη, εναν αριθμο (το id ενος αντικειμενου που επιλεχθηκε) και κανει ενα query βασισμενος σ αυτο το id. Σκοπευω να παρω καποια δεδομενα σε κειμενο μαζι με εναν πινακα με διαδρομες εικονων. Οχι τις εικονες, τα αρχεια, αλλα την διαδρομη που βρισκετε δηλαδη αυτο : "/filename/image01.jpg". Η δομη της βασης δεδομενων ειναι : δυο πινακες pins (αντικειμενα) και multi (εικονες). Ο multi εχει πεδιο m_pins που κραταει το id του Pins στο οποιο ανηκει, για να μπορω να τα συσχετισω. (ενα-προς-πολλα). Δηλαδη αν οι φωτο 2,3,5,8 εχουν m_pins 4, ανηκουν στο Pins με id 4. Και...ο κωδικας client.connect();var query = client.query('SELECT pins.p_name, type.t_name, era.e_name, controller.c_name, multi.m_name FROM pins,era, type, controller, multi WHERE type.t_id=pins.p_type AND era.e_id=pins.p_era AND controller.c_id=pins.p_controller AND multi.m_pins =pins.p_id AND pins.p_id ='+eoid)//eoid ηρθε απο client query.on("row", function (row, result) {result.addRow(row);}); query.on("end", function (result) { //πετα ολες τις διαδρομες εικονων στον πινακα, τωρα που τελειωσε το query var mnm=[]; for (var i=0; i<result.rows.length; i++) {mnm.push(result.rows[i].m_name);} //πιασε κ τ αλλα δεδομενα (κειμενο)...δε χρειαζετε for , γτ ετσι κ αλλιως ενα αντικειμενο ειναι var name = result.rows[0].p_name; var ty = result.rows[0].t_name; var er = result.rows[0].e_name; var cn = result.rows[0].c_name; //μαζεψε κ στειλε μεσω websockets connection.send(JSON.stringify({name:name,ty:ty, er:er, cn:cn,mnm:mnm})); client.end(); }); Φαινετε λογικοτατο, αλλα δε δουλευει. Η κονσολα μου γκρινιαζει οτι "Cannot read property 'p_name' of undifined " και αναφερετε σ αυτη τη γραμμη "var name = result.rows[0].p_name;" Αν αφαιρεσω οτι εχει να κανει με multi κτλ, ολα δουλευουν κανονικα Εχω δοκιμασει καποιες αλλαγες αλλα τιποτα. Καμια ιδεα? Υπαρχει καποιο λογικο λαθος που δεν βλεπω? Ευχαριστω για την υπομονη σας
Uberalles_gr Δημοσ. 7 Σεπτεμβρίου 2013 Δημοσ. 7 Σεπτεμβρίου 2013 Από ότι κατάλαβα ξέρεις το ID και θες να δεις ποιες είναι οι φώτο που ανήκουν σε αυτό το ID;; Γιατί εάν είναι αυτό SELECT m_name FROM multi WHERE m_pins = your_code
nucleus Δημοσ. 7 Σεπτεμβρίου 2013 Δημοσ. 7 Σεπτεμβρίου 2013 To query σου είναι σωστό σε sql σύνταξη και φέρνει δεδομένα? Αν φέρνει τότε το πρόβλημα ίσως είναι εδώ query.on("row", function (row, result) {result.addRow(row);}); Εδώ υποθέτω για κάθε row στο αποτέλεσμα της εκτέλεσης του query προσθέτεις το row στο result?Αυτό σίγουρα παίζει σωστά?
slevinkelevra Δημοσ. 7 Σεπτεμβρίου 2013 Μέλος Δημοσ. 7 Σεπτεμβρίου 2013 Ευχαριστω για τις απαντησεις @ Uberalles_gr Ναι, σωστα καταλαβες, απλα αυτο το query που εγραψες, θελω να το ενσωματωσω στο παραπανω για να μη κανω 2 διαφορετικα query. @nucleus Δεν ξερω...Εμενα μου φαινετε νορμαλ η συνταξη του. Ωστοσο πεταει αυτο το λαθος που σημειωσα παραπανω και δεν φερνει δεδομενα. Δεν μπορω να καταλαβω αν ειναι συνακτικο λαθος λογικο λαθος ή κατι παιζει με τον πινακα, μετα την εκτελεση του query Ναι, το on row ειναι για οσο τρεχει ακομα το query και κατεβαζει αποτελεσματα (rows) μεσα στο result. Ετσι ειναι και η συνταξη που δινει ο δημιουργος του module για να κανεις sql με javascript μεσα σε websockets. Τσεκαρε https://github.com/brianc/node-postgres/wiki/Query
nucleus Δημοσ. 7 Σεπτεμβρίου 2013 Δημοσ. 7 Σεπτεμβρίου 2013 (επεξεργασμένο) client.connect(); var query = client.query('SELECT pins.p_name, type.t_name, era.e_name, controller.c_name, multi.m_name FROM pins,era, type, controller, multi WHERE type.t_id=pins.p_type AND era.e_id=pins.p_era AND controller.c_id=pins.p_controller AND multi.m_pins =pins.p_id AND pins.p_id ='+eoid)//eoid ηρθε απο client query.on("row", function (row) { console.log('p_name=%s,t_name=%s,e_name=%s,c_name=%s', row.p_name, row.t_name,row.e_name,row.c_name); }); Για δοκίμασε μια το παραπάνω σε ένα ξεχωριστό αρχείο για να δούμε τι αποτελέσματα παίρνεις από την βάση. Μπορεί να έχει συντακτικά λάθη. Edit:Eπίσης γιατί κάνεις το query με συνένωση ενώ υποστηρίζονται prepared statements? https://github.com/brianc/node-postgres/wiki/Prepared-Statements Επεξ/σία 7 Σεπτεμβρίου 2013 από nucleus
slevinkelevra Δημοσ. 7 Σεπτεμβρίου 2013 Μέλος Δημοσ. 7 Σεπτεμβρίου 2013 Αν κλικαρω σε αντικειμενο που δεν εχει εικονες, η κονσολα λεει οτι "Connection accepted" αρχικα. Οκ... Μετα γυρναει ενα "[ ]" το οποιο τι ειναι δε μπορω να καταλαβω. Αδειος πινακας για ολα τα αποτελεσματα, ολου του query? Η αδειος πινακας που εχω ορισει εγω var mnm=[]; ? Και μετα το κλασικο λαθος "Cannot read property 'p_name' of undifined " που ανεφερα παραπανω. Αν τωρα κανω κλικ σε ενα αντικειμενο που εχει εικονες περνω κανονικα τα αποτελεσματα στον client. Αλλα με λαθος τροπο. Στη κονσολα τα αποτελεσματα εμφανιζονται τοσες φορες οσες ειναι κ οι εικονες. Δηλαδη η κονσολα δειχνει name1 type1 image1 name1 type1 image2 ενω επρεπε να δειχνει name1 type1 image1, image2, image3... επειδη το τελευταιο ειναι πινακας. Το μυαλο μου εγινε ζαμπον, παει.... Το χειροτερο ξερεις ποιο ειναι? Δεν μπορω να κανω ξεχωριστα query και να μαζεψω τα αποτελεσματα τους σε μεταβλητες και μετα να τα περασω ολα σε ενα connection.send() των websockets. Γιατι τις μεταβλητες δεν τις αναγνωριζει. Ειναι λες και αμα βγουν απο το query ψοφανε. Δεν ξερω, επηξα. Κανενας αλλος, καμια ιδεα, Βοηθηστε καλε κοσμε
nucleus Δημοσ. 7 Σεπτεμβρίου 2013 Δημοσ. 7 Σεπτεμβρίου 2013 Για το πρώτο που αναφέρεις Αν κλικαρω σε αντικειμενο που δεν εχει εικονες, η κονσολα λεει οτι "Connection accepted" αρχικα. Οκ... Μετα γυρναει ενα "[ ]" το οποιο τι ειναι δε μπορω να καταλαβω. Αδειος πινακας για ολα τα αποτελεσματα, ολου του query? Μάλλον είναι άδειο row μιας και το eoid δεν έχει εικόνες οπότε δεν βρέθηκε τίποτα στην βάση. Ο κώδικας που ανέφερα στο post #5 δείχνει τα αποτελέσματα όπως ακριβώς τα φέρνει η βάση οπότε η μορφή name1type1image1name1type1image2 είναι η αναμενόμενη.Σκοπός ήταν να δούμε ότι φέρνει δεδομένα το query που ισχύει. Ας δοκιμάσουμε αυτό console.log('p_name=%s,t_name=%s,e_name=%s,c_name=%s', result.rows[i].p_name, result.rows[i].t_name,result.rows[i].e_name,result.rows[i].c_name); copy-paste μέσα στο for που έχεις στο event query.on("end", function (result) πριν από το την εντολή mnm.push(result.rows[i].m_name); Τα παρακάτω βάλτα σε σχόλια. var name = result.rows[0].p_name; var ty = result.rows[0].t_name; var er = result.rows[0].e_name; var cn = result.rows[0].c_name; Τι αποτελέσματα βλέπεις στην κονσόλα? ΕDIT:ο κώδικας στο event query.on("end", function (result) πρέπει να εκτελείται μόνο αν το result έχει αποτελέσματα Result objectAvailable to the row and end events, shows the result of the query. It has the following properties: command: The sql command that was executed (e.g. "SELECT", "UPDATE", etc.) rowCount: The number of rows affected by the SQL statement (more information) oid: The oid returned rows: An array of rows (if the addRow command is used) θα το ελέγξεις με το rowCount θα το ελέγξεις με το result.rows.length εσύ αποφασίζεις
slevinkelevra Δημοσ. 7 Σεπτεμβρίου 2013 Μέλος Δημοσ. 7 Σεπτεμβρίου 2013 Ευχαριστω για τον χρονο που αφιερωνεις Οχι συνεχιζω με "result.rows.length" Εκανα ακριβως τις αλλαγες που ειπες Αν δεν υπαρχουν εικονες δεν εμφανιζει τιποτα, μονο [ ]. Δεν θα επρεπε ομως name, type κτλ να εμφανιζοντε? Αν υπαρχουν εικονες εμφανιζει p_name= diplodokos, t_name = zantolastixa, e_name=triasiki, c_name = megan fox για οσες εικονες υπαρχουν. Δηλαδη αυτο που εχει 2 εικονες το εμφανιζει 2 φορες. Κοιτα, καταλαβαινω οτι θες να με βοηθησεις, αλλα σορρυ, εχω μπερδευτει, τι ακριβως παιζει? Ευχαριστω
nucleus Δημοσ. 7 Σεπτεμβρίου 2013 Δημοσ. 7 Σεπτεμβρίου 2013 Υποψιάζομαι ότι κάπου το object result "χάνει" τα rows που περιέχει. Αυτό δουλεύει μέσα στο for και πριν το push result.rows[i].p_name και το αντίστοιχο μετά var name = result.rows[0].p_name; (είναι ακριβώς το ίδιο με το πιο πάνω με i=0) δεν παίζει. Η sql είναι σωστή και φέρνει αποτελέσματα.Για δοκίμασε αυτό query.on("end", function (result) { //πετα ολες τις διαδρομες εικονων στον πινακα, τωρα που τελειωσε το query var mnm=[]; var name = result.rows[0].p_name; var ty = result.rows[0].t_name; var er = result.rows[0].e_name; var cn = result.rows[0].c_name; for (var i=0; i<result.rows.length; i++) {mnm.push(result.rows[i].m_name);} //μαζεψε κ στειλε μεσω websockets connection.send(JSON.stringify({name:name,ty:ty, er:er, cn:cn,mnm:mnm})); client.end(); }); Σου πετάει το ίδιο error με πρίν ή όχι?
slevinkelevra Δημοσ. 7 Σεπτεμβρίου 2013 Μέλος Δημοσ. 7 Σεπτεμβρίου 2013 Η ιδια συμπεριφορα με πριν. Αν δεν υπαρχουν εικονες, [ ] και μετα το γνωστο error Aν υπαρχουν, εμφανιζει τα αποτελεσματα στην κονσολα x φορες. Ωστοσω στον client τα αποτελεσματα εμφανιζοντε κανονικα. Δηλαδη name, type κτλ σε tesxtfields και σε ενα div γραφει image1.jpg, image2, jpg κτλ Αλλα δε μπορω να το αφησω ετσι, επειδη αν δεν υπαρχουν εικονες θα μου πεταει error χωρις να πρεπει. Επισης, αν ενα σημειο εχει πχ 100 εικονες, θα καθυστερει πολυ στη μεταφορα δεδομενων. Να πεταξω το λαπτοπ απο το παραθυρο?
nucleus Δημοσ. 7 Σεπτεμβρίου 2013 Δημοσ. 7 Σεπτεμβρίου 2013 To error πριν το πέταγε και πάλι αν δεν είχε εικόνες ή πάντα?(Κατάλαβα ότι το πέταγε πάντα). Η λύση είναι η εξής βάλε να εκτελείται ο κώδικας στο event end μόνο αν έχει αποτελέσματα το result αν δεν έχει μπορείς να στέλνεις στον client απλώς ένα μήνυμα ότι δεν βρέθηκαν εικόνες ή τίποτα (η πρώτη λύση είναι καλύτερη).
slevinkelevra Δημοσ. 7 Σεπτεμβρίου 2013 Μέλος Δημοσ. 7 Σεπτεμβρίου 2013 Τελικα το συμπερασμα ειναι οτι αν δεν υπαρχουν εικονες το query αποτυγχανει. Client side, κανω alert τι λαβαινει κ βλεπω οτι αν δεν υπαρχουν εικονες, εξ αρχης τα λαβαινει ολα undifined ή κενα. Κατι που εμενα δε μου κανει λογικο, αφου θα επρεπε να λαβαινει κανονικα τα κειμενα και μονο τον πινακα των εικονων undifined. Και οσο για το query κανονικα θα επρεπε μονο το mnm να ειναι απλα,κενο και κενο να μεταφερετε, σωστα? Οχι να κομπλαρει τα παντα... Δοκιμασα και με if-else κτλ, αλλα τιποτα... Κανα workaround? Ευχαριστω κ παλι
nucleus Δημοσ. 8 Σεπτεμβρίου 2013 Δημοσ. 8 Σεπτεμβρίου 2013 connection.send(JSON.stringify({name:name,ty:ty, er:er, cn:cn,mnm:mnm})); Αυτό σίγουρα είναι σωστό?Δυστυχώς με JSON δεν έχω ασχοληθεί όσο θα ήθελα οπότε δεν νομίζω ότι μπορώ να βοηθήσω παραπάνω.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα