我有一個相當尷尬的問題。我創建一個池,連接到數據庫,創建一個連接和查詢,獲得結果,做了一堆東西,然後我必須創建另一個連接和查詢,但實際上它必須是動態的,所以我循環我的數組中包含數據的teacherHours
。節點和MySQL - connection.query裏面connection.query - 對象屬性不可訪問
然後更多的代碼正在發生,我必須創建一個額外的循環,因爲我的teacherHours
數組中的某些元素必須多次嘗試才能從即將到來的查詢中獲得正確的響應。
因此,另一個循環如下,它應該循環,只要availableHours > 0
。現在,這裏就是一切。
一批代碼發生在第二個循環內部,我準備第二個查詢,調用connection.query()和回調函數內部我準備我的第三個查詢(在做了其他一些事情之後),這實際上是Node踢我出去。它可以給我TypeError: Cannot read property 'tid' of undefined
。 tid
需要爲我的第三個查詢進行訪問,所以我嘗試訪問它,就像我之前做的,但節點不允許它。
我知道查詢返回有用的數據(行),所以它不能成爲查詢但沒有收到數據的問題。其實我console.log("the rowRIDS"+rowRIDS);
第二個查詢的結果,我看到它返回2行,然後它給了我錯誤。
對我來說也很奇怪,我的兩個循環中的所有console.logs都被記錄下來,而且我的第二個查詢(包含2行)的console.log在循環運行之後被記錄下來,因爲查詢嵌套不應該返回2行,並且錯誤出現在循環的第一次迭代中,因爲代碼應該在該點訪問第二個查詢。
順便說一句,我試圖設置一個硬編碼的數字,而不是tid
只是爲了獲得下一個屬性datum
是一個錯誤。我有種感覺,好像變量teacherHours超出範圍,但它應該是一個全局變量。
爲了更好地理解我在說什麼,我複製了代碼並取消了所有的JavaScript代碼註釋,我在其中填充和計算內容。任何幫助將會非常棒,它已經差不多7個小時的嘗試&錯誤,沒有任何運氣。謝謝!
pool.getConnection(function(err, connection){
if (err) throw err;
connection.query('SELECT * FROM teachers_teaching_tbl WHERE fwdid = 1 ', function(err, rows, fields) {
if (err) {
console.error('error querying: ' + err.stack);
return;
}
rowArray=rows;
console.log(rowArray);
//
// HERE HAPPENS
// A LOOOOT OF STUFF
//
// AND teacherHours IS BEING POPULATED
//
// THEN COMES A FOR LOOP
for(var i=0; i<teacherHours.length;i++){
//
// MORE STUFF
//
//AND ANOTHER LOOP
while(availableHours>0){//do{ ORIGINALLY I TRIED WITH A DO WHILE LOOP
//
// AGAIN A BUNCH OF STUFF
//
// NOW I'M PREPARING MY NEXT QUERY
//
var myQueryGetFreeRoom=" SELECT rms.rid FROM rooms_tbl as rms WHERE NOT EXISTS (";
myQueryGetFreeRoom+=" SELECT NULL FROM classes_tbl as cls ";
myQueryGetFreeRoom+=" WHERE ((cls.bis > '"+bisMinus1+"' AND cls.bis <= '"+realBis+"') OR (cls.von > '"+bisMinus1+"' AND cls.von < '"+realBis+"')) AND (cls.datum = '"+teacherHours[i].datum.getFullYear()+"-"+(teacherHours[i].datum.getMonth()+1)+"-"+teacherHours[i].datum.getDate()+"') AND (cls.rid=rms.rid) ) ";
//
//
connection.query(myQueryGetFreeRoom, function(err, rowRIDS, fields) {
if (err) {
console.error('error querying: ' + err.stack);
return;
}
roomIDs=rowRIDS;
console.log("the rowRIDS"+rowRIDS);
//
// MORE STUFF
// HAPPENING
//
if(roomIDs.length>0){
//
// PREPARING QUERY NO.3 - WHICH IS WHERE MY ERROR POINTS - TO THE USE OF tid PROPERTY
//
var myQueryBookClass = " INSERT INTO classes_tbl (rid , tid , belegtAnz, datum, von , bis) ";
myQueryBookClass+=" VALUES ("+Math.floor(Math.random() * roomIDs.length)+", "+teacherHours[i].tid+" , 0, '"+teacherHours[i].datum.getFullYear()+"-"+(teacherHours[i].datum.getMonth()+1)+"-"+teacherHours[i].datum.getDate()+"' , '"+bisMinus1+"' , '"+realBis+"') ";
console.log("myQueryBookClass: "+myQueryBookClass);
availableHours = 0;
//
// HERE WAS SUPPOSED TO FOLLOW QUERY 3 - myQueryBookClass
//
// BUT SINCE I DONT EVEN GET INSIDE HERE IT IS IN COMMENTS
//
/*connection.query(myQueryBookClass, function(err, insertRows, fields){
if(err){
console.error('error querying: '+err.stack);
return;
}
console.log("Inserted Rows: "+ insertRows);
}); */
} else {
availableHours= availableHours - 1;
//
// STUFF HAPPENING
//
}
});
availableHours= availableHours - 1;
}//while(availableHours>0);
//
}
connection.release(function(err){
if (err){
console.error('error disconnecting: ' + err.stack);
return;
}
});
});
});
順便說一句。最初我不想使用'availableHours = availableHours - 1; '在第二個'connection.query()'之後,我只想在第二個'connection.query()'中使用它。但是,如果我這樣做,我會得到一個無限循環,並且第二個'connection.query()'永遠不會進入..怪異 – b101