2015-12-11 53 views
2

您好我想編寫乾淨的代碼,我可以閱讀並且有一個很好的概述。有沒有辦法在xdmp.eval()中使用換行符

所以我寫了這一點:

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 

我試着用一個'+'號在一行以上生成一個字符串,交換單引號和雙引號,但沒有運氣。

能夠測試代碼(複製粘貼)到安全數據庫,使有很大的意義,我...

如果我把它包在同一個不可讀的線,它工作正常。

雨果

回答

3

有效地創建一個JavaScrit字符串的新線的方式是爲了躲避新行字符這樣

var str = "I'm displayed\ 
      in two line"; 

在最終的文件,你將有效地看到一個新的生產線。

如果您希望在dist output中看到新行,但不在src string中,您可以插入\n等效的返回行。

var str = "I'm displayed\n in two line"; 

在ES6,你將能夠使用`字符來實現同樣的事情,而不\

var str = `I'm displayed 
      in two line`; 
+0

https://davidwalsh.name/multiline-javascript-strings支持@haeresis所說的 – CtheGood

+0

我測試了這個,但是這似乎在MarkLogic查詢控制檯中沒有用。 –

+1

截至2015年12月,MarkLogic 8尚未支持ES6模板字符串(即使用「'」)。 –

2

也許你想這樣做的怪,但很有用數組符號方式:

變種multiline1 = [
'懶惰狐狸',
'躍過',
「噸他死了雞',
] .join('\ n');

和結果:
懶惰狐狸
躍過
的死雞

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

相關問題