Xpages 尝试在新数据库上设置标题时出错
我正在开发一个存档应用程序,其中包含以下代码:Xpages 尝试在新数据库上设置标题时出错,xpages,xpages-ssjs,Xpages,Xpages Ssjs,我正在开发一个存档应用程序,其中包含以下代码: var arcName:String = "Archives/" + aDBName + "-Backup-" + toDay + "-" + thisTime.slice(0,5); var server:String = appDB.getServer(); var arcDB:NotesDatabase = appDB.createCopy(server, arcName); arcDB.setTitle("This is a Test");
var arcName:String = "Archives/" + aDBName + "-Backup-" + toDay + "-" + thisTime.slice(0,5);
var server:String = appDB.getServer();
var arcDB:NotesDatabase = appDB.createCopy(server, arcName);
arcDB.setTitle("This is a Test");
但是它在arcDB.setTitle处失败-创建了数据库的新副本,因此在这一点上没有问题
这来自IBM知识库:
var db2:NotesDatabase = db.createCopy(null, "names2");
db2.setTitle("Copy of names");
我看不出这两段代码之间的区别。
我遗漏了什么吗?通常,当与数据库或设计对象相关的XPages出现问题时,我首先检查的是最大Internet名称和密码访问权限
或者更改,因此我使用sessionAsSigner或sessionAsSignerWithFullAccess进行工作通常,当与数据库或设计对象相关的XPages无法使用时,我首先检查的是最大Internet名称和密码访问权限
或者更改,以便我使用sessionAsSigner或sessionAsSignerWithFullAccess来完成工作如果您不关心有效用户对源数据库的访问权限、他们制作副本的权限以及他们在目标Domino服务器上创建NotesDatabase的访问权限,我绝对赞同弗雷德里克的建议,使用sessionAsSigner/WithFullAccess 此外,我发现最好使用try/catch(有助于故障排除和错误处理)、对象测试(.isOpen()(当访问NotesDatabase时)和返回调用函数可以读取的对象 下面是一些可能有帮助的示例代码:
var copyNotesDatabase = function(dbName) {
var isSuccessful = true;
var responseMessage = "";
try {
//set appDB using dbName from function arguments
var appDB = session.getDatabase(session.getServerName(),dbName);
//var appDB = sessionAsSigner.getDatabase(session.getServerName(),"sourceDb.nsf");
//var appDB = sessionAsSignerWithFullAccess.getDatabase(session.getServerName(),"sourceDb.nsf");
if(appDB.isOpen()) {
var arcName:String = "Archives/" + aDBName + "-Backup-" + toDay + "-" + thisTime.slice(0,5);
var server:String = appDB.getServer();
//arcDB will be created based on appDB permissions, ie effectiveUser, or sessionAsSigner, etc.
var arcDB:NotesDatabase = appDB.createCopy(server, arcName);
if(arcDB.isOpen()) {
arcDB.setTitle("This is a Test");
responseMessage = "Successfully copied NotesDatabase!"
} else {
isSuccessful = false;
responseMessage = "Unable to open copied NotesDatabase.";
}
} else {
isSuccessful = false;
responseMessage = "Unable to open source NotesDatabase.";
}
} catch(e) {
print("Error from SSJS: " + e);
isSuccessful = false;
responseMessage = e;
}
return { status : isSuccessful, message : responseMessage };
}
使用此功能,您可以执行以下操作:
function makeCopy(appName) {
var fObj = copyNotesDatabase(appName);
if(fObj.status) {
return "Successfully copied " + appName;
} else {
return fObj.message;
}
}
。。。至少,使用try/catch并返回错误至少会告诉您当前代码无法工作的原因。希望这有帮助 如果您不关心有效用户对源数据库的访问、他们制作副本的权限,以及他们在目标Domino服务器上创建NotesDatabase的访问权限,我绝对支持Fredrik使用sessionAsSigner/WithFullAccess的建议 此外,我发现最好使用try/catch(有助于故障排除和错误处理)、对象测试(.isOpen()(当访问NotesDatabase时)和返回调用函数可以读取的对象 下面是一些可能有帮助的示例代码:
var copyNotesDatabase = function(dbName) {
var isSuccessful = true;
var responseMessage = "";
try {
//set appDB using dbName from function arguments
var appDB = session.getDatabase(session.getServerName(),dbName);
//var appDB = sessionAsSigner.getDatabase(session.getServerName(),"sourceDb.nsf");
//var appDB = sessionAsSignerWithFullAccess.getDatabase(session.getServerName(),"sourceDb.nsf");
if(appDB.isOpen()) {
var arcName:String = "Archives/" + aDBName + "-Backup-" + toDay + "-" + thisTime.slice(0,5);
var server:String = appDB.getServer();
//arcDB will be created based on appDB permissions, ie effectiveUser, or sessionAsSigner, etc.
var arcDB:NotesDatabase = appDB.createCopy(server, arcName);
if(arcDB.isOpen()) {
arcDB.setTitle("This is a Test");
responseMessage = "Successfully copied NotesDatabase!"
} else {
isSuccessful = false;
responseMessage = "Unable to open copied NotesDatabase.";
}
} else {
isSuccessful = false;
responseMessage = "Unable to open source NotesDatabase.";
}
} catch(e) {
print("Error from SSJS: " + e);
isSuccessful = false;
responseMessage = e;
}
return { status : isSuccessful, message : responseMessage };
}
使用此功能,您可以执行以下操作:
function makeCopy(appName) {
var fObj = copyNotesDatabase(appName);
if(fObj.status) {
return "Successfully copied " + appName;
} else {
return fObj.message;
}
}
。。。至少,使用try/catch并返回错误至少会告诉您当前代码无法工作的原因。希望这有帮助 失败?是否有错误消息?失败?有错误消息吗?我在我的SSJS代码中这样做只是为了测试它是否有效。var appDB=sessionAsSignerWithFullAccess.getDatabase(“,”);appDB.openByReplicaID(服务器名,appRepID);然后我检查了appDB.getCurrentAccessLevel(),并将其设置为6(管理器),这是正确的,现在对于一个测试,我尝试删除一个文档,但它不会删除它。我拥有管理器权限和删除文档权限。因此,从我的阅读中,我认为appDB应该以完全访问权限打开,并允许删除。我真的不认为将最大互联网访问设置为高是一个好的解决方案。将代码分离并构建了一个简单的测试用例,它与sessionAsSignerWithFullAccess一起工作,看看我是否可以让它在生产端工作。Fredrik-终于让它在我的完整代码中工作。对DB的完全访问解决了setTitle问题,但在删除文档集合中的文档时遇到问题。然后我说我的测试用例有docCol.removeAll(true),我的完整代码有docCol.removeAll()。在完整代码中将其更改为docCol.removeAll(true),并删除了集合中的所有文档,但它现在可以工作。我在SSJS代码中这样做只是为了测试它是否可以工作。var appDB=sessionAsSignerWithFullAccess.getDatabase(“,”);appDB.openByReplicaID(服务器名,appRepID);然后我检查了appDB.getCurrentAccessLevel(),并将其设置为6(管理器),这是正确的,现在对于一个测试,我尝试删除一个文档,但它不会删除它。我拥有管理器权限和删除文档权限。因此,从我的阅读中,我认为appDB应该以完全访问权限打开,并允许删除。我真的不认为将最大互联网访问设置为高是一个好的解决方案。将代码分离并构建了一个简单的测试用例,它与sessionAsSignerWithFullAccess一起工作,看看我是否可以让它在生产端工作。Fredrik-终于让它在我的完整代码中工作。对DB的完全访问解决了setTitle问题,但在删除文档集合中的文档时遇到问题。然后我说我的测试用例有docCol.removeAll(true),我的完整代码有docCol.removeAll()。在完整代码中将其更改为docCol.removeAll(true),并删除了集合中的所有文档,但现在可以使用了。