Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Μπορει να εχει να κανει με 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 κτλ, ολα δουλευουν κανονικα

 

Εχω δοκιμασει καποιες αλλαγες αλλα τιποτα. Καμια ιδεα? Υπαρχει καποιο λογικο λαθος που δεν βλεπω?

 

Ευχαριστω για την υπομονη σας

 

 

 

 

 

 

Δημοσ.

Από ότι κατάλαβα ξέρεις το ID και θες να δεις ποιες είναι οι φώτο που ανήκουν σε αυτό το ID;; Γιατί εάν είναι αυτό

 

 

SELECT m_name FROM multi WHERE m_pins = your_code
Δημοσ.

To query σου είναι σωστό σε sql σύνταξη και φέρνει δεδομένα?

 

Αν φέρνει τότε το πρόβλημα ίσως είναι εδώ

 

query.on("row", function (row, result) {result.addRow(row);});

 

Εδώ υποθέτω για κάθε row στο αποτέλεσμα της εκτέλεσης του query προσθέτεις το row στο result?Αυτό σίγουρα παίζει σωστά?

Δημοσ.

Ευχαριστω για τις απαντησεις

 

@ Uberalles_gr Ναι, σωστα καταλαβες, απλα αυτο το query που εγραψες, θελω να το ενσωματωσω στο παραπανω για να μη κανω 2 διαφορετικα query.

 

@nucleus Δεν ξερω...Εμενα μου φαινετε νορμαλ η συνταξη του. Ωστοσο πεταει αυτο το λαθος που σημειωσα παραπανω και δεν φερνει δεδομενα. Δεν μπορω να καταλαβω αν ειναι

συνακτικο λαθος

λογικο λαθος

ή κατι παιζει με τον πινακα, μετα την εκτελεση του query

 

Ναι, το on row ειναι για οσο τρεχει ακομα το query και κατεβαζει αποτελεσματα (rows) μεσα στο result.

 

Ετσι ειναι και η συνταξη που δινει ο δημιουργος του module για να κανεις sql με javascript μεσα σε websockets. Τσεκαρε https://github.com/brianc/node-postgres/wiki/Query

Δημοσ. (επεξεργασμένο)

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

Επεξ/σία από nucleus
Δημοσ.

Αν κλικαρω σε αντικειμενο που δεν εχει εικονες, η κονσολα λεει οτι "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 ψοφανε.

 

Δεν ξερω, επηξα. Κανενας αλλος, καμια ιδεα,

Βοηθηστε καλε κοσμε

Δημοσ.

Για το πρώτο που αναφέρεις

 

 

Αν κλικαρω σε αντικειμενο που δεν εχει εικονες, η κονσολα λεει οτι "Connection accepted" αρχικα. Οκ...

Μετα γυρναει ενα "[ ]" το οποιο τι ειναι δε μπορω να καταλαβω. Αδειος πινακας για ολα τα αποτελεσματα, ολου του query?

 

 

Μάλλον είναι άδειο row μιας και το eoid δεν έχει εικόνες οπότε δεν βρέθηκε τίποτα στην βάση.

 

Ο κώδικας που ανέφερα στο post #5 δείχνει τα αποτελέσματα όπως ακριβώς τα φέρνει η βάση οπότε η μορφή
 

name1
type1
image1

name1
type1
image2

 

είναι η αναμενόμενη.Σκοπός ήταν να δούμε ότι φέρνει δεδομένα το 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 object

Available 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 εσύ αποφασίζεις

Δημοσ.

Ευχαριστω για τον χρονο που αφιερωνεις

Οχι συνεχιζω με "result.rows.length"

 

Εκανα ακριβως τις αλλαγες που ειπες

 

Αν δεν υπαρχουν εικονες δεν εμφανιζει τιποτα, μονο  [ ]. Δεν θα επρεπε ομως name, type κτλ να εμφανιζοντε?

Αν υπαρχουν εικονες εμφανιζει

p_name= diplodokos, t_name = zantolastixa, e_name=triasiki, c_name = megan fox

για οσες εικονες υπαρχουν. Δηλαδη αυτο που εχει 2 εικονες το εμφανιζει 2 φορες.

 

Κοιτα, καταλαβαινω οτι θες να με βοηθησεις, αλλα σορρυ, εχω μπερδευτει,  τι ακριβως παιζει?

 

Ευχαριστω

Δημοσ.

Υποψιάζομαι ότι κάπου το 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 με πρίν ή όχι?

Δημοσ.

Η ιδια συμπεριφορα με πριν. Αν δεν υπαρχουν εικονες, [ ] και μετα το γνωστο error

Aν υπαρχουν, εμφανιζει τα αποτελεσματα στην κονσολα x φορες.

Ωστοσω στον client τα αποτελεσματα εμφανιζοντε κανονικα. Δηλαδη name, type κτλ σε tesxtfields και σε ενα div γραφει image1.jpg, image2, jpg κτλ

 

Αλλα δε μπορω να το αφησω ετσι, επειδη αν δεν υπαρχουν εικονες θα μου πεταει error χωρις να πρεπει.

Επισης, αν ενα σημειο εχει πχ 100 εικονες, θα καθυστερει πολυ στη μεταφορα δεδομενων.

 

Να πεταξω το λαπτοπ απο το παραθυρο?

Δημοσ.

To error πριν το πέταγε και πάλι αν δεν είχε εικόνες ή πάντα?(Κατάλαβα ότι το πέταγε πάντα).
 
Η λύση είναι η εξής βάλε να εκτελείται ο κώδικας στο event end μόνο αν έχει αποτελέσματα το result αν δεν έχει μπορείς να στέλνεις στον client απλώς ένα μήνυμα ότι δεν βρέθηκαν εικόνες ή τίποτα (η πρώτη λύση είναι καλύτερη).

Δημοσ.

Τελικα το συμπερασμα ειναι οτι αν δεν υπαρχουν εικονες το query αποτυγχανει.

 

Client side, κανω alert τι λαβαινει κ βλεπω οτι αν δεν υπαρχουν εικονες, εξ αρχης τα λαβαινει ολα undifined ή κενα.

 

Κατι που εμενα δε μου κανει λογικο, αφου θα επρεπε να λαβαινει κανονικα τα κειμενα και μονο τον πινακα των εικονων undifined.

 

Και οσο για το query κανονικα θα επρεπε μονο το mnm να ειναι απλα,κενο και κενο να μεταφερετε, σωστα? Οχι να κομπλαρει τα παντα...

 

Δοκιμασα και με if-else κτλ, αλλα τιποτα...

 

Κανα workaround?

 

Ευχαριστω κ παλι

Δημοσ.
connection.send(JSON.stringify({name:name,ty:ty, er:er, cn:cn,mnm:mnm}));

Αυτό σίγουρα είναι σωστό?Δυστυχώς με JSON δεν έχω ασχοληθεί όσο θα ήθελα οπότε δεν νομίζω ότι μπορώ να βοηθήσω παραπάνω.

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...