【问题标题】:calling a LS agent from SSJS从 SSJS 调用 LS 代理
【发布时间】:2014-04-17 16:50:18
【问题描述】:

我在将参数从 SSJS 操作传递到 LS 后端代理时遇到问题。在 SSJS 我有这个代码:

var doc:NotesDocument = database.createDocument();
doc.appendItemValue("DeleteDocs",arr);
doc.appendItemValue("Form","frmWFSDeleteDocs");
var UNID = doc.getUniversalID();
dBar.info(UNID, "Doc ID");
doc.appendItemValue("ParentID",UNID);
doc.save();
var agent:NotesAgent = database.getAgent("WFSDeleteDocs");
dBar.info(doc.getItemValueString("ParentID"));
agent.runOnServer(doc.getItemValueString("ParentID"))

dBar 信息中显示的 UNID 是正确的文档 UNID。 在我的 LS 代理中,我有以下代码:

Set agent = s.CurrentAgent    
NoteId = agent.ParameterDocID 
Print "Notes Param " + NoteID
Set thisDoc = db.Getdocumentbyunid(NoteId)

在日志中 NoteID 不是 UNID 而是 HTTP 服务器:代理打印:Notes 参数 5A3439

当然 getDocumentbyunid 失败了。我对帮助的理解是,这应该与我在 runOnserver 中插入的参数相同。 我错过了什么

【问题讨论】:

  • 您应该传递 NoteID,而不是 UNID,但我想不出您发布的代码为什么会存储 NoteID...
  • 据我所知,您正在创建一个新文档,然后检索该文档的 unid,然后您才第一次保存它,对吗?我手头没有多米诺骨牌设计师,但据我所知,在第一次保存文档之前没有创建 final unid,所以这可能是传递的 id 不是一个你期望的。就像蒂姆一样,我无法猜测为什么 ID 可能会发生变化。您从代理代码中看到的格式为 noteId,不过

标签: parameters xpages agent xpages-ssjs


【解决方案1】:

您需要使用agent.run(<note id>) 运行代理。这会将注释 ID 传输给代理,然后您可以使用 agent.getParameterDocID() 读取注释 ID。

因此,在您的情况下,请在 SSJS 中执行此操作:

var agent:NotesAgent = database.getAgent("WFSDeleteDocs");
agent.run(doc.getItemValueString("ParentID"))

更新:如果您想将代理作为签名者运行,请使用 sessionAsSigner:

var backendDb:NotesDatabase = sessionAsSigner.getDatabase(session.getServerName(), database.getFilePath());
var agent:NotesAgent = backendDb.getAgent("WFSDeleteDocs");
agent.run(doc.getItemValueString("ParentID"))

【讨论】:

  • 但我必须让它 runOnServer 以便它以不同的 ID 运行。我不认为一个简单的 agent.run 会得到我需要的东西。
  • 您可以为此使用 sessionAsSigner。我已经更新了我的答案
  • 很奇怪,但即使 UNID 在 SSJS dBar.info 语句中是正确的,仍然没有通过代理参数传递 UNID。我想出了一种不同的方法来完成这项工作。因为 SSJS 文档是一个临时容器,所以我有一个包含它的视图,然后从视图中获取文档。如果两个人同时调用代理可能会出现问题,但这不太可能发生。
【解决方案2】:

您正在混合 NoteID 和 UniversalID

UniversalID 在数据库的不同副本中是通用的,通常甚至像 UUID 或 GUID 一样是全球通用的

NoteID 在 Notes 数据库中是本地的。数据库不同副本中的同一文档通常具有分配给同一文档的不同 NoteID。

代理参数传递必须是 NoteID。根本没有其他选择。

我不知道 SSJS Notes/Domino-API,但你应该可以使用这样的东西:

agent.runOnServer(doc.getNoteID())

所以你的 SSJS 代码是

var doc:NotesDocument = database.createDocument();
doc.appendItemValue("DeleteDocs",arr);
doc.appendItemValue("Form","frmWFSDeleteDocs");
doc.save();
var agent:NotesAgent = database.getAgent("WFSDeleteDocs");
agent.runOnServer(doc.getNoteID())

你的 Notes-agent-code 应该使用

Set thisDoc = db.GetdocumentbyId(NoteId)

而不是

Set thisDoc = db.Getdocumentbyunid(NoteId)

您的完整 Notes 代理

Set agent = s.CurrentAgent    
NoteId = agent.ParameterDocID 
Print "Notes Param " + NoteID
Set thisDoc = db.GetdocumentbyId(NoteId)

【讨论】:

    猜你喜欢
    • 2012-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多