【问题标题】:Cycle through a list of agents gives an error循环浏览代理列表会出错
【发布时间】:2014-05-26 01:01:06
【问题描述】:

我在一个操作按钮上有这个代码,它应该只通过代理运行并禁用所有计划的代理:

   var agentList:Array = database.getAgents();
   3: for (var n=0 ; n < agentList.length; ++n ){
   4:   var name:string = agentList[n];
   5:   dBar.info(name,"Agent Name ");
   6:   var ag:NotesAgent = database.getAgent(name);
   7:   dBar.info(ag.getName());
   8:   if (ag.isEnabled()){
   9:       dBar.info(ag.getName(),"Is Enabled ");
  10:       ag.isEnabled() = false;
  11:   }
  12: }

问题是当我运行它时,我得到了这个错误:

执行 JavaScript 动作表达式时出错 脚本解释器错误,line=6, col=38: [TypeError] Method NotesDatabase.getAgent(lotus.domino.local.Agent) not found,或非法参数

我从 dBar 知道 name 实际上是列表中第一个代理的名称,并且是一个字符串。但它似乎将名称字符串视为 lotus.domino.local.agent。

我是否遗漏了一些非常明显的东西?我拥有数据库的管理员访问权限,甚至还设置了管理员的最大 Internet 访问权限。

【问题讨论】:

    标签: javascript xpages agent


    【解决方案1】:

    database.getAgents() 返回代理列表,而不是代理名称列表。通过将name 强制转换为string,您可能能够说服调试工具栏告诉您它是一个字符串,但它不应该是。

    试试这个:

    var agentList = database.getAgents();
    for (var n = 0; n < agentList.length; n++) {
        var eachAgent = agentList[n];
        if (eachAgent.isEnabled() {
            dBar.info(eachAgent.getName(), "Is Enabled");
            eachAgent.setEnabled(false);
        }
    }
    

    特别注意setEnabled()if 的最后一行的替换...

    【讨论】:

    • 在gelp中它说isEnabled是读写的,但不是。当我将 JS 修改为上述内容时,它在 eachAgent.setEnabled(false) 上失败,并出现错误 Script interpreter error, line=5, col=27: [TypeError] Exception occurred calling method NotesAgent.setEnabled(boolean) null - 我有经理对数据库的权利,所以我现在真的很困惑。
    • enabled 属性是可读写的:isEnabled() 是读取,setEnabled(boolean) 是写入。但是,切换enabled 属性至少需要设计者访问权限...默认情况下,从浏览器访问应用程序时的最大 ACL 级别是编辑器。检查应用 ACL 的高级部分,以验证最高级别至少为 Designer。
    • 在 LS 中写了这个并且它在 LS 中的 isEnabled 是读/写的:Sub Initialize Dim session As New NotesSession Dim db As NotesDatabase Set db = session.CurrentDatabase If IsArray(db.Agents) Then ForAll a在 db.Agents If a.trigger = 1 then If a.isEnabled Then a.isEnabled = false a.save End If End if End ForAll End If End列表中的代理。
    • 所以我将 JS 代码修改为这个,但它甚至不会执行: var agent = database.getAgents().iterator(); while (agents.hasNext()) { var thisAgent:NotesAgent = agent.next(); if (thisAgent.TRIGGER_SCHEDULED ){ if (thisAgent.isEnabled()){ thisAgent.setEnabled(false); thisAgent.save(); } } thisAgent.recycle(); }
    • ps。我拥有数据库的管理员权限,Max internet 也是管理员。当我运行 LS 代理时,我当然是作为 Notes 客户端运行的。我不认为将 Internet 访问设置为 Designer 或 Manager 具有良好的安全性,因此不知道如何解决这部分问题。
    【解决方案2】:

    在 LotusScript 语言中,Notesdatabase.Agents 返回 NotesAgent 对象的数组。

    我今天从未尝试过 SSJS,但 SSJS Domino Designer 帮助对database.getAgents() 方法有这样的说法(请参阅IBM Domino Designer XPages Reference > Domino > NotesDatabase (JavaScript)):

    语法
    getAgents() : java.util.Vector

    用法 返回向量的元素是 NotesAgent 类型的

    在下面的示例中,java 迭代器用于循环返回的代理对象列表(看起来与您的任务完全一样,真的):

    var agents = database.getAgents().iterator();
    var list = "";
    while (agents.hasNext()) {
        list = list + agents.next().getName() + "\n";
    }
    return list
    

    设计师帮助并没有那么糟糕,真的 ;)

    【讨论】:

      【解决方案3】:

      @BillF:指您的 cmets 到 @TimTripcony 的回答:

      a) LotusScript 的语言结构无法与 SSJS 相比:LS 与 VisualBasic 密切相关,允许读/写属性,而 SSJS 与 Java 关系更密切,在 Java 中我们通常有单独的读取和更改方法属性。

      b)我认为您怀疑您允许通过 http 操作设计元素的方法是正确的。一种可能的方法是编写服务器端 LS 代理来执行您的任务,然后可以从您的 SSJS 代码触发该任务。可能需要使用sessionAsSigner 才能正确触发代理,当然您需要确保只有管理员才能这样做。

      【讨论】:

      • 实际上,我有相当多的 LS 库,我使用在服务器上运行从 SSJS 调用和运行,因为该进程需要以高级别访问权限运行,并且还需要能够删除文档。所以你的建议可能就是答案。我只是没有把它和这个函数放在一起。
      • 我创建了一个 LS 代理来执行此操作,并通过 runOnServer 调用它,它运行良好。
      【解决方案4】:

      正如 Tim 所写,您需要设置 ACL 最大 Internet 名称和密码至少设置为 Designer,否则这将失败。

      【讨论】:

      • 我不确定这是一个好的选择。我猜想它会带来许多可能的安全问题。事实上,对于我的应用程序,我更喜欢默认访问权限不高于作者,然后我根据文档的状态操作作者字段。
      猜你喜欢
      • 1970-01-01
      • 2020-10-14
      • 2016-08-08
      • 2020-01-02
      • 1970-01-01
      • 2018-12-08
      • 1970-01-01
      • 1970-01-01
      • 2016-05-26
      相关资源
      最近更新 更多