Node.js Meteor.loginWithPassword不使用带有@character的用户名

Node.js Meteor.loginWithPassword不使用带有@character的用户名,node.js,mongodb,meteor,Node.js,Mongodb,Meteor,我在数据库中有一个具有以下凭据的用户: { “_id”:“zTHv8yqPSm3pmi4So”, “电子邮件”:[{“地址”:”someemail@example.com“,“已验证”:true}], “服务”:{ “密码”:{ “bcrypt:“$2b$10$L6HXXXXXXXXXXXXXXXXXXXXXXXXXXXXXO1IJZEX6.PBXFOEQHQ。” }, “简历”:{ “loginTokens”:[] } }, “用户名”:”some@username", “简介”:{ “fir

我在数据库中有一个具有以下凭据的用户:

{
“_id”:“zTHv8yqPSm3pmi4So”,
“电子邮件”:[{“地址”:”someemail@example.com“,“已验证”:true}],
“服务”:{
“密码”:{
“bcrypt:“$2b$10$L6HXXXXXXXXXXXXXXXXXXXXXXXXXXXXXO1IJZEX6.PBXFOEQHQ。”
},
“简历”:{
“loginTokens”:[]
}
},
“用户名”:”some@username",
“简介”:{
“firstName”:“示例”,
“lastName”:“用户”,
}
}
当我尝试使用用户名登录用户时,它会显示找不到用户:

Meteor.loginWithPassword(“some@username“,”123456“,函数(错误){
console.log(错误原因);
});
它适用于电子邮件,但不适用于用户名


我希望能够灵活地使用电子邮件或用户名登录用户。API
Meteor.loginWithPassword
实际上将“选择器”作为第一个参数:

Meteor.loginWithPassword(选择器、密码、[callback])

论据

选择器
对象或字符串

解释为用户名或电子邮件的字符串;或者一个具有单键的对象:
电子邮件
用户名
id

在您的例子中,您使用字符串形式,让Meteor尝试猜测它是用户名还是电子邮件

但由于您的用户名包含“@”字符,这会误导Meteor将其解释为电子邮件:

Meteor.loginWithPassword=(选择器、密码、回调)=>{
如果(选择器的类型=='string')
如果(!selector.includes('@'))
选择器={username:selector};
其他的
选择器={email:selector};
这就是为什么当您尝试使用电子邮件时,它可以正常工作,但对于包含“@”的用户名,它却失败了

简单的解决方案是明确地告诉Meteor您的目标是用户名(而不是电子邮件,尽管有“@”):

Meteor.loginWithPassword({
用户名:“some@username"
},
"123456",
函数(错误){
console.log(错误原因);
}
);
现在,如果我想进一步猜测您的目标,您希望您的用户能够提供他们的电子邮件或用户名作为登录标识符,而不需要明确说明是哪一个?(类似于一种“omni”登录id输入)

在这种情况下,不幸的是,您将不得不检测您自己,它是电子邮件还是用户名。如果后者真的遵循如下模式:some@username,您可以尝试检测域是否不完整(没有扩展)

但是,如果您的任何用户确实注册了一个看起来像电子邮件的用户名(例如。“some@user.name),那么您可能无法区分它们

更糟糕的是,一些用户可能会选择一个与另一个用户的电子邮件地址完全相同的用户名!在这种情况下,如何判断哪个用户正在尝试登录

嗯,这对于稍微改进的用户体验来说是一个很大的麻烦。要么阻止用户名包含“@”,即强制执行一条规则,让您能够区分不同,要么提供一种方法,让用户在不明确时明确地知道它是一封电子邮件还是一个用户名(例如,可以通过一些收音机来辨别它是哪种类型;它仍然可以包含“自动”模式(用于登录id明确时)


顺便说一句,我们还可以设想执行两步登录尝试:首先按原样登录,然后如果用户名包含“@",显式地作为上述用户名。但我们可能仍会陷入上述最坏情况…

您在数据库中的用户记录没有密码。它看起来非常错误。它缺少一个带有加密密码的服务字段。我认为更好的问题是,这到底为什么适用于电子邮件?也许您是迪斯科舞厅的在meteor中发现了一个错误,因为根据您显示的记录,不应允许任何人登录。您实际上可以创建没有密码的用户,因此要求用户首先通过确认电子邮件或密码重置电子邮件设置密码。这在your db has
“username”中有很好的记录:some@username",
但您的登录尝试使用的是
someusername
。这是问题所在还是您的问题中的一个输入错误?对不起,这是一个输入错误