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),并删除了集合中的所有文档,但现在可以使用了。