有没有办法在xdmp.eval()中使用换行符

时间:2015-12-11 14:36:32

标签: javascript marklogic

您好我想编写一些我可以阅读的清晰代码,并且有很好的概述。

所以我写了这个:

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,交换单引号和双引号但没有运气。

能够将此代码(复制粘贴)测试到安全数据库对我来说很有意义......

如果我将它全部包装在一条不可读的行中,它就可以了。

雨果

3 个答案:

答案 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