XPages SSJS - 在另一个数据库中创建文档

XPages SSJS - Creating a Document in Another Database

我收到以下错误 "Exception occurred calling method NotesDatabase.createDocument() null":

var db:NotesDatabase = session.getDatabase("", viewScope.targetDb);
if (db != null) {
   if(db.isOpen()){
   }else{
        db.open();
    }
} else {
}
var doc:NotesDocument = db.createDocument();

评论: 数据库 db 可用且 "open"。 用户在 targetDb 中有足够的权限来创建文档。

怎么了?

根据 Paul Stephen Withers 的提示,我将 db.isOpen 更改为 db.isOpen()。 现在 db.open() 给出了错误 "Exception occurred calling method NotesDatabase.open() null" 尽管我可以在 viewScope 变量中得到服务器、文件路径等

专业提示 -- 获取调试工具栏并使用它来将消息打印到 XPage 调试工具栏以查看发生了什么以及是否设置了 viewScope 变量。此外,学习使用 try catch 块来捕获异常并将错误消息打印到调试工具栏。你会这样找到你的问题。 https://www.openntf.org/main.nsf/project.xsp?r=project/XPage%20Debug%20Toolbar

改变

var db:NotesDatabase = session.getDatabase("", viewScope.targetDb);

var db:NotesDatabase = session.getDatabase(currentDatabase.getServer(), viewScope.targetDb);

这适用于网络和 XPinC。

XPages 与公式不同,它不喜欢服务器名称的空字符串定义,这与说明的文档相反(对于 server NotesSession.getDatabase 的参数 - javascript):]

The name of the server on which the database resides. Use null to indicate the session's environment, for example, the current computer

使用 null 或 "" 会出现错误 500。

问题中的代码将起作用,如果:

  • if 块被完全删除
  • viewScope.targetDb 变量有一个正确指定的注释数据库文件路径,它与当前数据库存在于同一服务器上
  • 当前用户有权访问目标数据库(通过 ACL),具有创建数据库的权限
  • 根据@Paul
  • ,目标数据库的最大 Internet 名称和密码超过 Reader

我怀疑原因是您正在检查 db.isOpen。你应该检查 db.isOpen().

值得注意的是 session.getDatabase(String, String) 不会 return null(除非您使用的是 OpenNTF Domino API)。它 return 是一个未打开的数据库对象。所以 if 语句是无关紧要的。此外,最佳做法是将服务器名称传递给 session.getDatabase() - 如果该应用程序曾经在 XPiNC 中与您当前的代码一起使用过,您将得到不同的结果。

无论个人用户访问权限如何,ACL 的“高级”选项卡上的 "Maximum Internet name and password" 都会覆盖它。如果最大互联网访问权限为无访问权限,则任何人都无法创建文档。但我怀疑这不是这里的一个因素。