我们在MarkLogic平台上讨论服务器端java脚本。 现在我很困惑:
// query
function testBoolean(){
return false
}
if(testBoolean()){'true'} else {'false'}
给出字符串“false”,因为testBoolean()的类型为Boolean。
现在我自己的函数也返回一个布尔值,但我需要在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'不存在(duhhh),该函数返回值为'false'的类型boolean,但仍然传递为true。我试着查看'different-transaction'选项。
当我明确比较需要将false转换为字符串时?
userExists('notextistinguser')=='false'
那么我的自定义功能现在是什么类型的?它报告布尔值,但作为字符串?
答案 0 :(得分:4)
将您的最后一行更改为:
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
答案 1 :(得分:1)
xdmp.eval()
始终返回ValueIterator
。 gniourf_gniourf
是MarkLogic如何进行惰性评估的核心。非ValueIterator
null
将始终是真实的,就像任何非ValueIterator
(非布尔)对象一样。如果您知道您的eval返回单个值(或者您只想要第一个值),请在null
实例上使用.next().value
(或者更准确地说,在MarkLogic中使用fn.head(vi)
> = 8.0 -5)。例如,
ValueIterator
请注意,'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
会根据XQuery的规则将单例值强制转换为其有效布尔值,XQuery定义了它的语义。
请查看我的applyAs()
wrapper function,了解使用第一类函数使fn.boolean()
稍微简单一点。
答案 2 :(得分:0)
当您的函数返回res
时,res
不是false
的实际布尔值或任何将被强制为false的值。因此,返回'truthy'值并强制转换为布尔值true。
您需要验证函数返回的内容,并根据需要强制转换为布尔值。