电子邮件地址验证的唯一性(xpages)

电子邮件地址验证的唯一性(xpages),xpages,xpages-ssjs,Xpages,Xpages Ssjs,案例:创建一个数据库(系统),供用户在names.nsf中请求电子邮件和更新 发现问题,假设我们无法编辑names.nsf视图或创建新视图来检查Internet地址的唯一性 示例:用户的InternetAddress(电子邮件地址)字段为:TestUser1@brooke.com.my 我不能使用picker validator来验证电子邮件地址的唯一性,因为没有视图,也不允许在names中创建视图。nsf只是对其进行排序并使用其进行验证,我可以知道还有其他方法进行验证吗~ arr内的样本值

案例:创建一个数据库(系统),供用户在names.nsf中请求电子邮件和更新

发现问题,假设我们无法编辑names.nsf视图或创建新视图来检查Internet地址的唯一性

示例:用户的InternetAddress(电子邮件地址)字段为:TestUser1@brooke.com.my

我不能使用picker validator来验证电子邮件地址的唯一性,因为没有视图,也不允许在names中创建视图。nsf只是对其进行排序并使用其进行验证,我可以知道还有其他方法进行验证吗~

arr内的样本值

2017年7月19日新增编码

var setdoc:NotesDocument = database.getProfileDocument("System Setting", "");
var server = setdoc.getItemValueString("DBSvr");
var DName = setdoc.getItemValueString("DbPath");
var db:NotesDatabase = session.getDatabase(server, DName, false);

var vw:NotesView = db.getView("($VIMPeopleByLastName)")
var doc:NotesDocument = vw.getFirstDocument();

var arr = [];       

while (doc != null) {
    var tmpdoc = vw.getNextDocument(doc);
    arr.push(doc.getItemValueString("InternetAddress"));
    doc.recycle();  //  to prevent IBM Notes Crash use recycle  //  The recycle method unconditionally destroys an object // and returns its memory to the system.
    doc = tmpdoc;
}

value=getComponent("mail11").getValue() +"@devsvr1.pcs.com.my"

return @IsMember(value, arr);

更新的测试结果:

-场的性质

-验证属性字段

-编码部分

<xp:this.expression><![CDATA[#{javascript:
var setdoc:NotesDocument = database.getProfileDocument("System Setting", "");
var server = setdoc.getItemValueString("DBSvr");
var DName = setdoc.getItemValueString("DbPath");
var db:NotesDatabase = session.getDatabase(server, DName, false);

var vw:NotesView = db.getView("($VIMPeopleByLastName)")
var doc:NotesDocument = vw.getFirstDocument();

var arr = [];       

while (doc != null) {
    var tmpdoc = vw.getNextDocument(doc);

        arr.push(doc.getItemValueString("InternetAddress"));

    doc.recycle();
    doc = tmpdoc;
}

value=getComponent("mail11").getValue() +"@devsvr1.pcs.com.my"

return @IsMember(value, arr);
}]]></xp:this.expression>

我发现在不更改名称的情况下查找internet地址有三种可能性。nsf:

  • “浏览”隐藏视图“($Users)”并将您的internet地址与列
    InternetAddress
  • 使用

  • 如果names.nsf为全文索引,则使用

  • 搜索的示例

    var公式='InternetAddress='TestUser1@brooke.com.my":"TestUser2@brooke.com.my";
    var dc:NotesDocumentCollection=database.search(公式);
    如果(dc.getCount()>0){
    //阅读文档的Internet地址,并告诉用户哪些已被使用
    }
    
    FTsearch
    示例:

    var search='[InternetAddress]='TestUser1@brooke.com.my";
    var dc:NotesDocumentCollection=database.FTsearch(搜索);
    如果(dc.getCount()>0){
    //告诉用户internet地址已被使用
    }
    
    将您的代码放入例如表达式验证程序:

    
    

    包含要验证的字段值。不要忘记使用message控件向用户显示错误消息。

    我发现有三种方法可以在不更改名称的情况下查找internet地址。nsf:

  • “浏览”隐藏视图“($Users)”并将您的internet地址与列
    InternetAddress
  • 使用

  • 如果names.nsf为全文索引,则使用

  • 搜索的示例

    var公式='InternetAddress='TestUser1@brooke.com.my":"TestUser2@brooke.com.my";
    var dc:NotesDocumentCollection=database.search(公式);
    如果(dc.getCount()>0){
    //阅读文档的Internet地址,并告诉用户哪些已被使用
    }
    
    FTsearch
    示例:

    var search='[InternetAddress]='TestUser1@brooke.com.my";
    var dc:NotesDocumentCollection=database.FTsearch(搜索);
    如果(dc.getCount()>0){
    //告诉用户internet地址已被使用
    }
    
    将您的代码放入例如表达式验证程序:

    
    

    包含要验证的字段值。不要忘记使用消息控件向用户显示错误消息。

    这里有一个SSJS函数,用于检查任何可用通讯簿中是否存在具有特定ID的用户:

    function isDominoUser(id) {
        try {
            var db,vw,doc,itr;
    
            itr=sessionAsSigner.getAddressBooks().iterator();
            while (itr.hasNext()) {
                db=itr.next();
                try {
                    if (!db.open()) continue;
                    vw=db.getView("($Users)");
                    doc=vw.getDocumentByKey(id,true);
                    if (doc) {
                        doc.recycle();
                        vw.recycle();
                        return true;
                    }
                    vw.recycle();
                } catch(err1) {}
            }
    
        } catch(err) {
            java.lang.System.out.println("ERROR: "+err.toString()+" [isDominoUser]");
        }
        return false;
    }
    
    由于($Users)视图还包含邮件地址,因此您可以使用该功能查找用户是否已使用特定地址注册

    根据您发布的代码示例,验证表达式将如下所示:

    return isDominoUser(getComponent("mail11").getValue()+"@devsvr1.pcs.com.my");
    

    PS:您必须确保签名者至少具有对通讯簿的读取权限。

    这里有一个SSJS功能,用于检查任何可用通讯簿中是否存在具有特定ID的用户:

    function isDominoUser(id) {
        try {
            var db,vw,doc,itr;
    
            itr=sessionAsSigner.getAddressBooks().iterator();
            while (itr.hasNext()) {
                db=itr.next();
                try {
                    if (!db.open()) continue;
                    vw=db.getView("($Users)");
                    doc=vw.getDocumentByKey(id,true);
                    if (doc) {
                        doc.recycle();
                        vw.recycle();
                        return true;
                    }
                    vw.recycle();
                } catch(err1) {}
            }
    
        } catch(err) {
            java.lang.System.out.println("ERROR: "+err.toString()+" [isDominoUser]");
        }
        return false;
    }
    
    由于($Users)视图还包含邮件地址,因此您可以使用该功能查找用户是否已使用特定地址注册

    根据您发布的代码示例,验证表达式将如下所示:

    return isDominoUser(getComponent("mail11").getValue()+"@devsvr1.pcs.com.my");
    

    PS:您必须确保签名者至少具有地址簿的读取权限。

    我想在验证中检查是否存在……使用哪种验证程序类型更好。由于我尝试一点也不成功~您可以在($NamesFieldLookup)或($Users)视图中使用地址作为查找键执行GetDocumentByKey。如果给定表达式无效~我将更新错误照片和新代码我尝试计算字段我的编码看起来正常。它给“真”,意味着存在。但在validator-expression中,它会给出一个错误消息表达式无效将代码放入“表达式”(=服务器端JavaScript SSJS),而不是“clientScript”(=客户端JavaScript CSJS),我想放入验证中以检查是否存在…哪个验证器类型更适合使用。由于我尝试一点也不成功~您可以在($NamesFieldLookup)或($Users)视图中使用地址作为查找键执行GetDocumentByKey。如果给定表达式无效~我将更新错误照片和新代码我尝试计算字段我的编码看起来正常。它给“真”,意味着存在。但是在validator-expression中,它给出了一个错误消息表达式是无效的将代码放入“表达式”(=服务器端JavaScript SSJS),而不是“客户端脚本”(=客户端JavaScript CSJS)。很遗憾,他们不允许在names.nsf中添加视图,因为视图会使这更简单,不会破坏任何其他内容。遗憾的是,他们不允许在names.nsf中添加视图,因为(通过电子邮件联系的人)视图会使这更简单,不会破坏任何其他内容。问题:我需要将其发布在“表达式”或“客户端脚本”上吗顺便说一句:我的答案是基于你最初发布的代码想要实现什么。但是,如果您打算在用户已经存在的情况下显示错误消息,那么您当然必须使用否定版本,即
    return!isDominoUser(…)
    。问题:我需要将其发布在“表达式”或“客户端脚本”区域吗?顺便说一句:我的答案基于您最初使用代码想要实现的目标