您好我想编写一些我可以阅读的清晰代码,并且有很好的概述。
所以我写了这个:
var id = '12345';
var coll = ['scc-roles','scc-proj-' + id];
var spm = 'some-role';
var data = {role : spm, roleNames : 'sccss-user', collection : coll}
var spmRoleId = xdmp.eval('declareUpdate();
var sec = require("/MarkLogic/security.xqy");
var roleId = sec.createRole(role, "Generated project member", roleNames, null, collection,null,null);
var uri = "http://marklogic.com/xdmp/roles/" + roleId;
xdmp.documentAddCollections(uri,collection)',data,{"database" : xdmp.securityDatabase()})
但显然xdmp.eval()
[javascript] JS-JAVASCRIPT: + 'var sec = require("/MarkLogic/security.xqy"); -- Error running JavaScript request: SyntaxError: Unexpected token ILLEGAL
我尝试使用' +'签署以生成多于一行的strng,交换单引号和双引号但没有运气。
能够将此代码(复制粘贴)测试到安全数据库对我来说很有意义......
如果我将它全部包装在一条不可读的行中,它就可以了。
雨果
答案 0 :(得分:3)
在JavaScrit字符串中有效创建新行的方法是像这样转义新行char
var str = "I'm displayed\
in two line";
在最终文件中,您将看到有效的新行。
如果您希望在dist output
中看到新行,而不是src string
,则只需插入\n
等效的返回行。
var str = "I'm displayed\n in two line";
在es6中,你可以使用`char来实现同样的事情而不用\
var str = `I'm displayed
in two line`;
答案 1 :(得分:2)
也许你想要这种奇怪但有用的数组符号方式:
var multiline1 = [
'懒惰的狐狸',
'跳过',
'死鸡',
]。加入( '\ n');
,结果:
懒狐狸
跳了过来
死鸡
答案 2 :(得分:2)
通常,您应该避免使用字符串连接来为eval构建代码。字符串使得很难发现错误,并且是injection attacks的一个很好的载体。相反,我建议你在XQuery或JavaScript中编写一个正确的函数,并使用xdmp.invokeFunction
来评估它。 invokeFunction
采用与xdmp.eval
相同的所有选项。
这是一个在安全数据库的上下文中获取角色的示例。 applyAs
函数返回一个函数,该函数包装调用者提供的函数,并使用提供的eval选项对其进行评估。
function applyAs(fct, options) {
return function() {
var params = Array.prototype.slice.call(arguments);
// Curry the function to include the params by closure.
// xdmp.invokeFunction requires that invoked functions have
// an arity of zero.
var f = (function() {
return fct.apply(null, params);
}).bind(this);
// Allow passing in user name, rather than id
if(options.user) { options.userId = xdmp.user(options.user); delete options.user; }
// Allow the functions themselves to declare their transaction mode
if(fct.transactionMode && !(options.transactionMode)) { options.transactionMode = fct.transactionMode; }
return xdmp.invokeFunction(f, options); // xdmp.invokeFunction returns a ValueIterator
}
}
/**
* Gets an Array of id-name Objects. Requires privileged access to security.
*
* @param names An optional Array of role IDs as strings used to filter
* @return An Array of Objects with role ID keys and role name values
*/
function getRoles(names) {
var sec = require('/MarkLogic/security.xqy');
var db = {database: xdmp.securityDatabase()};
var roleIDs = applyAs(sec.getRoleIds, db);
var rolesItr;
if(Array.isArray(names)) {
rolesItr = roleIDs(xdmp.arrayValues(names));
} else {
rolesItr = roleIDs();
}
var roleNames = applyAs(sec.getRoleNames, db)(rolesItr).toArray().map(function(el) { return el.textContent; });
var roles = [];
var i = 0;
for(var role of rolesItr) {
var r = {}
r[role.textContent] = roleNames[i++];
roles.push(r);
}
return roles;
}
getRoles();
最初来自gist。