【发布时间】:2016-04-07 14:37:50
【问题描述】:
我遇到了一个非常尴尬的问题。 我创建一个池,连接到数据库,创建一个连接和查询,获取结果,做很多事情,然后我必须创建另一个连接和查询,但实际上它必须是动态的,所以我循环遍历我的数组 @ 987654321@ 包含数据。
然后发生了更多代码,我必须创建一个额外的循环,因为我的 teacherHours 数组的某些元素必须多次尝试才能从即将到来的查询中获得正确的响应。
接下来是另一个循环,它应该循环到availableHours > 0。现在,一切都在这里了。
大量代码发生在第二个循环中,我准备了第二个查询,调用 connection.query() 并在回调函数内部准备了第三个查询(在做了一些其他事情之后),这实际上是 Node 启动的地方我出去。
它给了我TypeError: Cannot read property 'tid' of undefined。我的第三个查询需要访问tid,所以我尝试像以前一样访问它,但 Node 不允许它。
我知道查询返回有用的数据(行),因此不会是查询但没有接收到数据的问题。实际上我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;
}
});
});
});
【问题讨论】:
-
顺便说一句。最初我不想在第二个
connection.query()之后使用availableHours= availableHours - 1;,而只是想在第二个connection.query()中使用它。但如果我这样做,我会得到一个无限循环,第二个connection.query()永远不会被输入.. 奇怪
标签: javascript mysql node.js