【问题标题】:Error when trying to setTitle on new DB尝试在新数据库上设置标题时出错
【发布时间】:2014-09-03 18:23:47
【问题描述】:

我正在开发一个包含以下代码的存档应用程序:

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 xpages-ssjs


【解决方案1】:

通常,当与数据库或设计对象相关的 XPage 无法使用时,我首先检查的是最大 Internet 名称和密码访问权限https://stackoverflow.com/a/23045860/1187943

或者更改,以便我使用 sessionAsSigner 或 sessionAsSignerWithFullAccess 完成工作

【讨论】:

  • 我在我的 SSJS 代码中这样做只是为了测试它是否有效。 var appDB=sessionAsSignerWithFullAccess.getDatabase("",""); appDB.openByReplicaID(serverName,appRepID);然后我检查了 appDB.getCurrentAccessLevel() 并将其设置为 6(经理),这是正确的,现在为了测试我尝试删除一个文档但它不会删除它我有经理权限并删除文档权限。所以我从阅读中认为 appDB 应该以完全访问权限打开并允许删除。我真的不认为将最大 Internet 访问设置得高是一个好的解决方案。
  • 将代码拆开并构建了一个简单的测试用例,它现在可以与 sessionAsSignerWithFullAccess 一起使用,看看我是否可以让它在生产端工作。
  • Fredrik - 终于让它在我的完整代码中工作了。数据库上的完整访问解决了 setTitle 问题,但在删除文档集合中的文档时遇到了麻烦。然后我说我的测试用例有 docCol.removeAll(true) 我的完整代码有 docCol.removeAll()。在完整代码中将其更改为 docCol.removeAll(true) 并删除了集合中的所有文档,但它现在可以工作了。
【解决方案2】:

如果您不关心有效用户对源数据库的访问、他们制作副本的权限以及他们在目标 Domino 服务器上创建 NotesDatabase 的访问权限,我绝对会同意 Fredrik 使用 sessionAsSigner/ 的建议具有完全访问权限。

此外,我发现最好的做法是使用 try/catch(有助于故障排除和错误处理)、对象测试(访问 NotesDatabase 时的 .isOpen())以及返回调用函数可以读取的对象。

以下是一些可能有帮助的示例代码:

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 并返回您的错误至少会告诉您为什么当前代码无法正常工作。希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-28
    • 2021-11-20
    • 2021-01-22
    • 1970-01-01
    • 2013-04-05
    相关资源
    最近更新 更多