我们在MarkLogic平台上谈论的是服务器端java脚本。现在我很困惑:
// query
function testBoolean(){
return false
}
if(testBoolean()){'true'} else {'false'}
给出字符串"false",因为testBoolean()是布尔类型。
现在我自己的函数也返回一个布尔值,但我需要一个明确的比较才能if()
弄清楚它......
function userExists(userName) {
// check if user exists in security database
var data = {userName : userName}
var options = {
"database" : xdmp.securityDatabase()
};
var res = xdmp.eval("declareUpdate(); var sec = require('/MarkLogic/security.xqy'); sec.userExists(userName)",
data,options);
return res
};
// make sure result is actually aboolean
// xdmp.type(userExists('scc-user-1'))
if(userExists('notextistinguser')){ 'true' } else {'false'}
给出字符串"true"???
用户 'notextistinguser' 不存在(duhhhh),该函数返回值 'false' 的类型布尔值,并且仍然作为 true 传递。我尝试查看"不同交易"选项。
当我明确比较需要将 false 转换为字符串时?
userExists('notextistinguser')=='false'
那么我现在的自定义函数是什么类型呢?它报告布尔值,但充当字符串?
将最后一行更改为:
if(fn.boolean(userExists('notextistinguser'))){ 'true' } else {'false'}
或将函数的返回更改为:
return fn.boolean(res)
现在返回正确的结果。
fn.boolean()
会为您将其转换为实际的 JavaScript 布尔值。
以下是测试的一些结果:
typeof(userExists('notextistinguser')) //Returns Object
typeof(fn.boolean(userExists('notextistinguser'))) //Returns Boolean
https://docs.marklogic.com/fn.boolean
xdmp.eval()
总是返回一个ValueIterator
。 ValueIterator
是 MarkLogic 进行惰性求值的核心。非null
ValueIterator
将始终是真实的,就像任何非null
(非布尔)对象一样。如果您知道 eval 返回单个值(或者您只需要第一个值),请在 ValueIterator
实例上使用 .next().value
(或者更准确地说,在 MarkLogic>=8.0-5 中使用fn.head(vi)
)。例如
'use strict';
var itr = xdmp.eval('false;'); // Returns a ValueIterator
// instance that iterates
// over a singleton boolean value
itr instanceof ValueIterator; // true
1 === itr.count; // true, singleton
false !== itr && true !== itr; // true, ValueIterators aren’t booleans
false === fn.boolean(itr); // true, fn.boolean coerces
// singleton ValueIterator
// instances to their effective
// boolean values
false === itr.next().value; // true
请注意,fn.boolean()
将根据定义其语义的 XQuery 的规则将单例值强制为其有效布尔值。
看看我的 applyAs()
包装器函数,了解使用一流函数使使用xdmp.eval()
更简单的示例。
当您的函数返回res
时,似乎res
不是 false
的实际布尔值或任何会被强制为 false 的值。因此,相反,返回一个"真"值并强制转换为布尔真。
您需要验证函数返回的内容,并根据需要强制转换为布尔值。