ColdFusion 2018 не интерпретирует undefined как пустую строку

Сервер ColdFusion обновлен до ColdFusion 2018 (с ColdFusion 9 или 11).

Одно из самых старых приложений на этом сервере содержит такой код: < cfif arguments[key] NEQ "">

Раньше это, кажется, было эквивалентно isDefined("arguments.key") или StructKeyExists(arguments, key).

Сегодня, несмотря на то, что isDefined("arguments.key") ложно, а StructKeyExists(arguments, key) тоже отрицательно, <cfif arguments[key] NEQ ""> терпит неудачу, потому что arguments[key] больше не ведет себя как пустая строка. На самом деле < cfdump var="#arguments[key]#"> отображает «undefined».

Что я могу сделать, чтобы избежать изменения кода везде, где вместо StructKeyExists использовалась пустая строка? Возможно, параметр сервера ColdFusion? (THIS.enableNullSupport не помогло)


person user13859151    schedule 26.02.2021    source источник
comment
Странно, что это когда-то так работало. Поскольку тот же код выдаст ошибку при использовании с обычной структурой. (О чем думала Adobe ....?) В любом случае, я подозреваю, что нет настройки для изменения поведения и что вам нужно будет обновить код:/   -  person SOS    schedule 27.02.2021
comment
Проверьте свой код на cfparam, который по умолчанию устанавливает для этих несуществующих переменных пустые строки (default=""). Это также может быть связано с кровотечением из прицела. Трудно сказать, не видя фактического кода, где вы столкнулись с проблемой.   -  person Alex    schedule 27.02.2021
comment
@Alex - поведение структуры аргументов, похоже, отличается от обычных структур, а также, похоже, изменилось вокруг CF2018 trycf.com/gist/14effc106da7f5cabf6cbb48da8a4a17/   -  person SOS    schedule 28.02.2021
comment
@SOS Да, ты прав. Я написал ответ для этого.   -  person Alex    schedule 28.02.2021


Ответы (2)


Обозначение скобок для области ARGUMENTS всегда будет возвращать значение undefined для несуществующих ключей и значений во всех версиях Adobe ColdFusion.

function f() {
    return arguments[key];
}
f(); // returns undefined

function f() {
    return arguments["key"];
}
f(); // returns undefined

function f() {
    return arguments.key;
}
f(); // throws exception: Element KEY is undefined in ARGUMENTS

Все 3 случая должны вызывать исключение. Это непоследовательно и должно рассматриваться как ошибка. Вероятно, он сохранен только для обратной совместимости.

Впрочем, как вы уже заметили:

// ACF 10
(undefined eq "") -> TRUE

// ACF 11
(undefined eq "") -> TRUE

// ACF 2016
(undefined eq "") -> TRUE

// ACF 2018
(undefined eq "") -> FALSE

// ACF 2021
(undefined eq "") -> TRUE

Adobe представила поддержку NULL в ACF 2018 и сломала это поведение. Они исправили это в ACF 2021, но не в ACF 2018, классический ход Adobe.

Либо сообщите об этой ошибке в Adobe и надейтесь на обновление (последнее исправление ошибки для ACF 2018 было сделано в ноябре 2019 года, так что удачи), либо исправьте свое старое приложение, не полагаясь на эту хитрую проверку аргументов функции.

person Alex    schedule 28.02.2021
comment
Отлично, спасибо за все подробности. Затем, фиксируя приложение это. - person user13859151; 01.03.2021
comment
@ user13859151 - Из любопытства, вы когда-нибудь отправляли отчет об ошибке для этого, так как похоже, что поведение изменилось ... снова ... с CF2018 Update 11. - person SOS; 26.04.2021
comment
@SOS - нет, я изменил свой код, чтобы вместо этого использовать StructKeyExists - person user13859151; 28.04.2021
comment
@ user13859151 - Ну, это лучшее решение, ИМО. Поскольку поведение, казалось, изменилось, мне просто любопытно, исправили ли они ошибку сознательно или это был просто счастливый побочный эффект какого-то другого обновления :-). - person SOS; 29.04.2021

IsDefinedValue может помочь, поскольку он не зависит от NULL и также проверяет существование значения.

https://cflib.org/udf/isDefinedValue

person Harry    schedule 26.02.2021