我是javascript和xpages的新手。我正在将旧的笔记应用程序升级到xpages。在我的xpage中,我有一个字段,一个保存按钮和一个错误消息控件。该字段用于保存用户输入的nsf路径/名称的值,以便稍后使用(例如://SAS/address.nsf)。如何验证该路径/数据库是否存在?之前的lotusscript就是这样的(它使用2个字段,一个用于获取服务器路径,另一个用于获取数据库路径。但对于当前的xpage,要求仅使用一个字段):
svr$= source.FieldGetText("ServerPath")
dbsvr$= source.FieldGetText("DBPath")
Dim db1 As New NotesDatabase(svr$ , dbsvr$)
If Not db1.IsOpen Then
Messagebox "Cannot find the database."
Call source.GotoField("DBPath")
continue = False
Exit Sub
End If
在xpage的字段中,我添加了一个validateExpression验证器。在表达式属性中,我计算以下SSJS:
var dbdir:NotesDbDirectory = session.getDbDirectory(null);
var db:NotesDatabase = dbdir.openDatabase(document1.getItemValue("dbpath"));
return db.isOpen();
在验证者的消息属性中,我输入“找不到数据库”。
我一直得到的错误是:
有什么方法可以解决这个问题?这是验证器的错误用法吗?我已经在其他服务器上使用本地数据库和数据库进行测试。似乎没有工作。我试过的所有数据库都拥有对它们的访问权限。
答案 0 :(得分:1)
你应该使用sessionAsSigner来打开数据库作为XPage的签名者 - 而不是匿名(如果你没有登录)。另外,请考虑在dbdir.OpenDatabase()周围添加try / catch,以便捕获使用无效路径打开数据库的错误。
另请注意,validateExpression验证程序必须返回布尔值true或false。在你的情况下,如果无法打开数据库,dbdir.openDatabase()将返回null - 这意味着db.isOpen()将无法工作,因为它无法对空对象进行操作。
您可以考虑使用必须返回错误消息的customValidator验证器(而不是布尔值true或false)。
我希望这可以帮助您完成验证。
答案 1 :(得分:0)
使用try / catch块尝试打开数据库。如果一切正常,只需在try块中返回true即可。 Catch块将返回false,将处理大多数可能的失败:服务器错误,连接断开,路径无效,无法访问等等。
try {
// open database here and touch some property, doc count, for example
return true;
} catch (e) {
return false; // failed to open database
}