ich diese Funktion in einem CFC vor kurzem erstellt, die in den Anwendungsbereich instanziiert wird:unecht, intermittierende, variable undefiniert Fehler
Public String function url_for(path='') {
var results = '';
var these_parms = '';
var parm_delim = '?';
for (key in Arguments) {
if (len(Arguments[key])) {
switch(key) {
case "path":
results = '#arguments[key]#';
break;
case "template":
results = '/cf/#arguments[key]#';
break;
case "productid":
if (NOT comparenocase(left(arguments[key],2),'p_'))
results = real_url_for(partno=replace(arguments[key],'p_',''));
else
results = real_url_for(productid=arguments[key]);
break;
case "categoryid":
results = real_url_for(categoryid=arguments[key]);
break;
case "specialid":
results = real_url_for(specialid=arguments[key]);
break;
case "partno":
if (NOT len(arguments['path']))
results = real_url_for(partno=arguments[key]);
else
these_parms = listappend(these_parms,'#key#=#urlencodedformat(arguments[key])#','&');
break;
case "parms":
these_parms = listappend(these_parms,'#arguments[key]#','&');
break;
default:
these_parms = listappend(these_parms,'#key#=#urlencodedformat(arguments[key])#','&');
break;
}
}
}
if (len(results)) { //*********** error always occurs here
for (var i=1;i LTE variables.rewritequery.recordcount;i=i+1) {
if (NOT comparenocase(variables.rewritequery.internalurl[i], results)) {
results = variables.rewritequery.externalurl[i];
break;
}
}
}
if (len(results) AND len(these_parms)) {
if (listlen(results,'?') GT 1)
parm_delim = '&';
results = listappend(results, these_parms, parm_delim);
}
return results;
}
Es wird hunderte oder tausende Male pro Stunde, manchmal Dutzende Male in der gleiche Anfrage, aber alle paar Stunden oder so wirft es einen Fehler (immer an der im obigen Code markierten Zeile): Variable RESULTS ist undefined
Ich kann kein Muster erkennen für wann, wie oder warum es geworfen wird . Die gleichen Eingaben, die verwendet werden, wenn der Fehler auftritt, werden Sekunden später funktionieren. Hauptsächlich kann ich nicht sehen, wie es überhaupt jemals geworfen werden sollte.
Ich dachte, es könnte möglich sein, dass die aufgerufene Funktion (real_url_for) einen undefinierten Wert zurückgibt, aber es hat die gleiche var results='';
, und diese Variable ist, was es zu dieser Funktion zurückgibt.
Ich weiß nicht, ob dies relevant ist, aber die Datei application.cfm definiert eine Wrapper-Funktion app_url_for()
, die einfach den Wert dieser Funktion aufruft und zurückgibt. Dies ist zu vermeiden, Application.URLManager.url_for()
überall zu referenzieren.
Das hat mich ratlos. Ich vermute, ich könnte nach der Existenz der Variablen suchen, aber das sollte nicht nötig sein. Hier
ist die real_url_for
Funktion:
Private String function real_url_for() {
var results = '';
for (key in Arguments) {
if (len(Arguments[key])) {
switch(key) {
case "productid":
results = '/cf/displaylearnmore.cfm?#key#=#arguments[key]#';
break;
case "categoryid":
results = '/cf/learnmorelist.cfm?#key#=#arguments[key]#';
break;
case "specialid":
results = '/cf/displayspecial.cfm?#key#=#arguments[key]#';
break;
case "partno":
results = '/part/#arguments[key]#';
break;
}
}
}
return results;
}
Ich werde versuchen, var key='';
auf beiden Funktionen hinzufügen und sehen, ob das hilft.
Klingt nach Rennbedingungen aufgrund variabler Leckage. Den Code überspringend sehe ich mindestens eine Variable, die nicht var ist: 'key'. Überprüfen Sie zuerst die aufgerufenen Funktionen und überprüfen Sie, ob alle lokalen Variablen der Funktion lokalisiert sind. – Ageax
Können Sie uns den Code in 'real_url_for' zeigen? Variablenverlust (zumindest in "url_for") erklärt das Problem nicht, aber @Ageax hat immer noch Recht. – Alex
https://StackOverflow.com/questions/34164252/losing-Variable-Element-is-undefined-in-Variables –