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

XPages SSJS-在另一个数据库中创建文档,xpages,xpages-ssjs,Xpages,Xpages Ssjs,我收到以下错误“调用方法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();

我收到以下错误“调用方法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();
评论: 数据库数据库可用且“打开”。 用户在targetDb中有足够的权限创建文档

怎么了

根据Paul Stephen Withers的提示,我将db.isOpen改为db.isOpen()。 现在db.open()给出了错误“调用方法NotesDatabase.open()null时发生异常”,尽管我可以在viewScope变量中获取服务器、文件路径等。

Pro提示--获取调试工具栏并使用它将消息打印到XPage调试工具栏,以查看发生了什么以及是否设置了viewScope变量。另外,学习使用try-catch块捕获异常,并将错误消息打印到调试工具栏。你会发现你的问题就是这样。 改变

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

这在web和XPinC上都有效

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

数据库所在的服务器的名称。使用null来 指示会话的环境,例如,当前计算机

使用null或“”将显示错误500。

如果满足以下条件,问题中的代码将起作用:

  • if块被完全删除
  • viewScope.targetDb变量具有正确指定的notes数据库文件路径,该路径与当前数据库位于同一服务器上
  • 当前用户具有对目标数据库的访问权限(通过ACL),并具有“创建数据库”权限
  • 根据@Paul,目标数据库的最大Internet名称和密码高于读卡器

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

值得记住的是
session.getDatabase(String,String)
不会返回null(除非您使用的是OpenNTF Domino API)。它返回一个未打开的数据库对象。所以,如果语句是无关的。另外,最佳做法是将服务器名称传递给
会话.getDatabase()
——如果应用程序与当前代码一起在XPiNC中使用,则会得到不同的结果


无论个人的用户访问权限如何,ACL的“高级”选项卡上的“最大Internet名称和密码”都将覆盖该权限。如果“最大internet访问”为“无访问”,则任何人都无法创建文档。但我怀疑这不是一个因素。

这是完整的代码吗?您能否提供完整的脚本以及完整的错误消息?在使用println(db.getTitle());)创建文档之前,是否可以输出db的标题?在路径中是否使用“/”而不是“\”?targetDb等于应用程序中另一个位置设置的URL,换句话说,使用“/”。我正在使用调试工具栏,并设置各种viewScope变量以查看发生了什么。不要忘了最后一个参数createOnFail,默认情况下为true。如果数据库不存在,将其设置为false将引发错误
var db:NotesDatabase = session.getDatabase(currentDatabase.getServer(), viewScope.targetDb);