我在一个操作按钮上有这个代码,该按钮应该只运行代理并禁用所有已安排的代理:
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]方法NotesDatabase.getAgent(lotus.domino.local.Agent)未找到,或非法参数
我从dBar知道这个名字实际上是列表中第一个代理的名称,是一个字符串。但似乎它将名称字符串视为lotus.domino.local.agent。
我错过了一些非常明显的东西吗?我有Manager访问数据库,甚至也设置了对Manager的最大Internet访问权限。
答案 0 :(得分:3)
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
...
答案 1 :(得分:1)
在LotusScript语言中,Notesdatabase.Agents
返回 NotesAgent对象的数组。
我从未在SSJS中尝试过,但是SSJS Domino Designer帮助可以说明database.getAgents()
方法(参见 IBM Domino Designer XPages参考&gt; Domino&gt; 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
Designer帮助并不是那么糟糕,真的;)
答案 2 :(得分:0)
@BillF:在@TimTripcony的回答中提到您的意见:
a)LotusScript的语言结构无法与SSJS的语言结构进行比较:LS与VisualBasic相近,允许读/写属性,而SSJS与Java有更密切的关系,我们通常有单独的方法用于阅读和更改属性。
b)我认为你对通过http允许操作设计元素的方法表示怀疑是正确的。一种可能的方法是编写服务器端LS代理来执行您的任务,然后可以从您的SSJS代码触发该任务。可能需要使用sessionAsSigner
才能正确触发代理,当然您需要确保只有管理员才能这样做。
答案 3 :(得分:0)
如果Tim写道,您需要设置ACL最大Internet名称和密码至少设置为Designer,否则会失败。