XPages SSJS-在另一个数据库中创建文档
我收到以下错误“调用方法NotesDatabase.createDocument()null时发生异常”: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();
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);