Parameters 从SSJS调用LS代理

Parameters 从SSJS调用LS代理,parameters,xpages,agent,xpages-ssjs,Parameters,Xpages,Agent,Xpages Ssjs,我无法将参数从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.appendItem

我无法将参数从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"))
Set agent = s.CurrentAgent    
NoteId = agent.ParameterDocID 
Print "Notes Param " + NoteID
Set thisDoc = db.Getdocumentbyunid(NoteId)
dBar信息中显示的UNID是正确的文档UNID。 在我的LS代理中,我有以下代码:

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"))
Set agent = s.CurrentAgent    
NoteId = agent.ParameterDocID 
Print "Notes Param " + NoteID
Set thisDoc = db.Getdocumentbyunid(NoteId)
在日志中,NoteID不是UNID,而是 HTTP服务器:代理打印:Notes参数5A3439

当然,getDocumentbyunid失败了。我在查看帮助时的理解是,该值应与我在runOnserver中插入的参数值相同。
我是否缺少一些内容

您需要使用
agent.run()
运行代理。这将把便笺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"))

您需要使用
agent.run()
运行代理。这将把便笺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"))

您正在混合NoteID和UniversalID

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

Notes ID是Notes数据库的本地ID。数据库不同副本中的同一文档通常为同一文档分配了不同的NoteID

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

我不知道SSJS Notes/dominoapi,但您应该能够使用如下内容:

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代理代码应该使用

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)

您正在混合NoteID和UniversalID

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

Notes ID是Notes数据库的本地ID。数据库不同副本中的同一文档通常为同一文档分配了不同的NoteID

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

我不知道SSJS Notes/dominoapi,但您应该能够使用如下内容:

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代理代码应该使用

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)

但是我必须让它在服务器上运行,这样它才能以不同的ID运行。我认为一个简单的agent.run无法满足我的需要。你可以使用sessionAsSigner来实现这一点。我更新了我的答案,这很奇怪,但是仍然没有通过代理参数传递UNID,即使UNID在SSJS dBar.info语句中是正确的。我想出了一个不同的方法来实现这一点。因为SSJS文档是一个临时容器,所以我有一个包含它的视图,然后从视图中获取文档。如果两个人同时调用代理,则可能会出现问题,但这不太可能。但我必须让它在服务器上运行,以便它使用不同的ID运行。我认为简单的agent.run无法满足我的需要。您可以使用sessionAsSigner进行此操作。我更新了我的答案,这很奇怪,但是仍然没有通过代理参数传递UNID,即使UNID在SSJS dBar.info语句中是正确的。我想出了一个不同的方法来实现这一点。因为SSJS文档是一个临时容器,所以我有一个包含它的视图,然后从视图中获取文档。如果两个人同时调用代理,可能会出现问题,但这不太可能。你应该传递一个NoteID,而不是UNID,但我想不出为什么你发布的代码会存储一个NoteID…根据我得到的信息,你正在创建一个新的文档,然后检索该文档的UNID,直到后来你第一次保存它,对吗?我手头没有DominoDesigner,但据我记忆所及,在第一次保存文档之前没有创建最终的unid,因此这可能是传递的id不是您期望的id的原因之一。像蒂姆一样,我猜不出为什么身份证会改变。你在代理代码中看到的是noteId格式,虽然你应该传递noteId,而不是UNID,但我想不出为什么你发布的代码会存储noteId…根据我得到的信息,你正在创建一个新文档,然后检索该文档的UNID,直到后来你第一次保存它,对吗?我手头没有DominoDesigner,但据我记忆所及,在第一次保存文档之前没有创建最终的unid,因此这可能是传递的id不是您期望的id的原因之一。像蒂姆一样,我猜不出为什么身份证会改变。但是,从代理代码中看到的是noteId格式