在这里,我正在使用 Node.js Express 应用程序学习 MongoDB。 我正在使用 Bcrypt 保护我的密码。在 mongodb 中加密和保存是成功的,但是当我尝试比较 SigIn 的密码时,它只是失败了。
SignUp route
router.post('/signUp', (req, res, next) => {
let userData = req.body;
mongoose.connect(DB_URL, {useNewUrlParser: true}, (err) => {
if (err) throw err;
console.log('DB is connected Successfully');
bcrypt.hash(userData.password, saltRounds, function (err, hash) {
User.create({
name: userData.name,
fname:userData.fname,
email:userData.email,
password:hash
}).then(() => {
//success callback
res.send('Saved');
}).catch(next);
});
});
});
SignIn route
router.post('/signIn', (req, res) => {
const incomingEmail = req.body.email;
const incomingPassword = req.body.password;
mongoose.connect(DB_URL, {useNewUrlParser: true}, (err) => {
if (err) throw err;
console.log('DB is connected Successfully');
User.find({incomingEmail}).then((user) => {
if (user.length > 0) {
bcrypt.compare(incomingPassword, user.password).then(function (result) {
res.status(200).json({status: 200, data: user[0]});
}).catch(() => {
res.send('incorrect password')
});
} else {
res.status(404).json({status: 404, data: 'User not found'});
}
}).catch(() => {
res.status(404).json({status: 404, data: 'Email not matched'});
});
});
});
使用有效的登录凭据显示
{"status": 404, "data": "User not found" }
即使我尝试仅在电子邮件匹配时发送密码,它仍然没有返回任何内容。
User.find({incomingEmail}).then((user) => {
res.send(user.password);
}).catch(() => {
res.status(404).json({status: 404, data: 'Email not matched'});
});
我在 Windows 10 上使用 WebStorm。
Node 版本为11.12.0
项目包.json
"dependencies": {
"bcrypt": "3.0.4",
"body-parser": "latest",
"cookie-parser": "~1.4.3",
"debug": "~2.6.9",
"express": "~4.16.0",
"mongodb": "^3.1.13",
"mongoose": "^5.4.17",
"mongoose-unique-validator": "^2.0.2",
"morgan": "~1.9.0"
}
如果有人有答案请告诉我。谢谢
最佳答案
您的代码没有任何问题。我已经在我这边测试过了。我看到的唯一异常是在发送响应时,您有一个响应数组,但将其作为单个对象读取。
这是我上面说的行话的意思
代替
User.find({incomingEmail}).then((user) => {
res.send(user.password);
}).catch(() => {
res.status(404).json({status: 404, data: 'Email not matched'});
});
这样做
User.find({incomingEmail}).then((user) => {
res.send(user[0].password);
}).catch(() => {
res.status(404).json({status: 404, data: 'Email not matched'});
});
OR IN ANOTHER CASE
我可以看到您可以做的是不使用 MONGOOSE ONLY FIND 方法!您也可以使用 FINDONE 方法,这样它就不需要为单个用户读出 JSON 响应数组。 FINDONE 将帮助您处理已有的代码。
关于node.js - Bcrypt 密码比较不起作用。 Node.js Express App 中甚至 user.password 为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55276880/
我怎样才能完成http://php.net/manual/en/function.call-user-func-array.php在ruby中?所以我可以这样做:classAppdeffoo(a,b)putsa+benddefbarargs=[1,2]App.send(:foo,args)#doesn'tworkApp.send(:foo,args[0],args[1])#doeswork,butdoesnotscaleendend 最佳答案 尝试分解数组App.send(:foo,*args)
Devise是一个Ruby库,它为我提供了这个User类:classUser当写入:confirmable时,注册时会发送一封确认邮件。上周我不得不批量创建300个用户,所以我在恢复之前注释掉了:confirmable几分钟。现在我正在为用户批量创建创建一个UI,因此我需要即时添加/删除:confirmable。(我也可以直接修改Devise的源码,但我宁愿不去调和它)问题:如何即时添加/删除:confirmable? 最佳答案 WayneConrad的解决方案:user=User.newuser.skip_confirmation
有没有办法在Rails中为确认字段自定义消息?例如在设计中我必须输入密码和password_confirmation并且错误消息是:Passwordconfirmationdoesn'tmatchPassword我可以更改事件记录语言环境消息(“不匹配”),但它会在该语言环境消息的开头和结尾输出密码确认和密码,所以我得到如下内容:"PasswordconfirmationmustmatchPassword"有没有办法将其更改为不同的字符串?PasswordconfirmationandPasswordmustmatch.编辑另一件事是拥有完全自定义的消息,例如:'Setpassword
我正在尝试创建密码规则来设计可恢复的密码更改。我通过passwords_controller.rb做了一个父类(superclass),但我需要在应用规则之前检查用户角色,但我所拥有的只是reset_password_token。 最佳答案 假设您的模型是用户:User.with_reset_password_token(your_token_here)Source 关于ruby-on-rails-设计通过reset_password_token获取用户,我们在StackOverflow
你能解释一下吗?我想评估来自两个不同来源的值和计算。一个消息来源为我提供了以下信息(以编程方式):'a=2'第二个来源给了我这个表达式来评估:'a+3'这个有效:a=2eval'a+3'这也有效:eval'a=2;a+3'但我真正需要的是这个,但它不起作用:eval'a=2'eval'a+3'我想了解其中的区别,以及如何使最后一个选项起作用。感谢您的帮助。 最佳答案 您可以创建一个Binding,并将相同的绑定(bind)与每个eval相关联调用:1.9.3p194:008>b=binding=>#1.9.3p194:009>eva
我正在尝试对某些帖子的评论使用简单的身份验证。用户使用即时ID和密码输入评论我使用“bcrypt”gem将密码存储在数据库中。在comments_controller.rb中像这样@comment=Comment.new(comment_params)bcrypted_pwd=BCrypt::Password.create(@comment.user_pwd)@comment.user_pwd=bcrypted_pwd当用户想要删除他们的评论时,我使用data-confirm-modalgem来确认数据在这部分,我必须解密用户输入的密码以与数据库中的加密密码进行比较我怎样才能解密密码,
我有一个允许更新用户记录的表单。它包含:password和:password_confirmation字段,但我不希望在数据库中已存储加密密码时对它们运行验证。View文件中的字段:'ConfirmPassword'%>在互联网上搜索时,我发现了这段代码,我认为它是针对以前版本的Ruby/Rails的。(我会把它放在我的用户模型中。)validates_presence_of:password,:on=>create由于我的用户模型中密码验证的语法不同(如下),我对我需要的语法感到困惑。validates:password,:presence=>true,:confirmation=>
我开始了一个新的Rails3.2.5项目,Assets管道不再工作了。CSS和Javascript文件不再编译。这是尝试生成Assets时日志的输出:StartedGET"/assets/application.css?body=1"for127.0.0.1at2012-06-1623:59:11-0700Servedasset/application.css-200OK(0ms)[2012-06-1623:59:11]ERRORNoMethodError:undefinedmethod`each'fornil:NilClass/Users/greg/.rbenv/versions/1
我正在使用devise,当用户更改密码时,网站会将他们注销。我在网上读到,添加sign_in可以解决问题但不起作用,并且当密码更改时用户会注销。这是我的代码if@user.errors[:base].empty?and@user.update_attributes(params[:user])sign_in(current_user,:bypass=>true)flash[:success]="Useraccounthasbeensuccessfullyupdated"redirect_toedit_user_path(params[:site_id],@user)elserender
rails新手。只是想了解\assests目录中的这两个文件。例如,application.js文件有如下行://=requirejquery//=requirejquery_ujs//=require_tree.我理解require_tree。只是将所有JS文件添加到当前目录中。根据上下文,我可以看出requirejquery添加了jQuery库。但是它从哪里得到这些jQuery库呢?我没有在我的Assets文件夹中看到任何jquery.js文件——或者直接在我的整个应用程序中没有看到任何jquery.js文件?同样,我正在按照一些说明安装TwitterBootstrap(http: