Node.js 如何在登录nodejs时验证电子邮件和密码
我现在刚开始学习nodejs,我编写了用于登录的api,我使用bcrypt npm加密了密码。现在我想验证电子邮件和密码。逻辑应该是这样的:只有注册用户才有资格登录,并且给定的密码也应该匹配。此密码在他或她注册时必须相同 这两个条件要匹配其他条件,它在控制台中显示错误消息,如此,如果电子邮件地址错误,则必须显示“未找到用户”。如果他输入了错误的密码,则必须显示“请输入有效密码”。如果两者都正确,则必须显示用户已成功登录 如果我不清楚我的疑问,请发表评论 这是登录Api:Node.js 如何在登录nodejs时验证电子邮件和密码,node.js,Node.js,我现在刚开始学习nodejs,我编写了用于登录的api,我使用bcrypt npm加密了密码。现在我想验证电子邮件和密码。逻辑应该是这样的:只有注册用户才有资格登录,并且给定的密码也应该匹配。此密码在他或她注册时必须相同 这两个条件要匹配其他条件,它在控制台中显示错误消息,如此,如果电子邮件地址错误,则必须显示“未找到用户”。如果他输入了错误的密码,则必须显示“请输入有效密码”。如果两者都正确,则必须显示用户已成功登录 如果我不清楚我的疑问,请发表评论 这是登录Api: app.post("/a
app.post("/api/login", async (req, res) => {
// console.log(req.body)
const loginInfo = {
email: req.body.email,
password: req.body.password
};
// console.log(loginInfo)
const log = Login.find(
{ email: req.body.email },
{ password: req.body.password }
);
console.log(log);
if (email == email && password == password) {
console.log(loggedsucessfully);
} else {
console.log(invalidlogin);
}
const hash = await bcrypt.hash(req.body.password, saltRounds);
req.body.password = hash;
// console.log(req.body)
const loggedUsers = new Login(req.body);
try {
const result = await loggedUsers.save();
res.json(result);
} catch (error) {
res.status(400).json({ message: "sorry something went wrong" });
}
});
这些是我安装的npms:
const express = require('express');
const app = express();
const cors = require('cors');
const bodyParser = require('body-parser');
const bcrypt = require('bcrypt');
const saltRounds = 10;
require('./models/db');
const Jobs = require('./models/job');
const Users = require('./models/user')
const Login = require('./models/login')
app.use(cors());
app.use(bodyParser.urlencoded({ extended: true }))
app.use(bodyParser.json())
这是数据库db.js:
const mongoose = require("mongoose");
mongoose
.connect("mongodb://localhost:27017/jobsdb", {
useNewUrlParser: true,
useUnifiedTopology: true
})
.then(() => {
console.log("Connected");
})
.catch(error => {
console.error(error);
});
这是schema login.js
const mongoose = require(`mongoose`);
const loginSchema = new mongoose.Schema({
email: { type: String, required: true, trim: true },
password: { type: String, required: true, trim: true }
});
const Login = mongoose.model("login", loginSchema);
module.exports = Login;
我找到了一个解决办法。在数据库中搜索之前,您可以编写一个函数“验证”并检查电子邮件
const Joi = require('@hapi/joi');
function validateUser(user) {
const schema = {
name: Joi.string().min(3).max(50).required(),
email: Joi.string().min(5).max(255).required().email(),
password: Joi.string().min(3).max(255).required()
};
return Joi.validate(user, schema);
}
app.post('/api/login', async (req, res) => {
const { error } = validateUser(req.body);
if (error) return res.status(400).send(error.details[0].message);
...
}
首先,我们需要找到具有给定电子邮件的用户。 如果用户不是falsy,那么我们需要将给出的密码与找到的用户的密码进行比较。如果相等,则登录成功 您可以使用以下路线:
router.post("/api/login", async (req, res) => {
try {
const { email, password } = req.body;
let user = await User.findOne({ email });
if (!user) return res.status(400).send("User not found");
const validPassword = await bcrypt.compare(password, user.password);
if (!validPassword) return res.status(400).send("Please enter a valid password.");
//at this point, login is successfull, return the user info without the password info
user.password = undefined;
res.send(user);
} catch (err) {
console.log(err);
res.status(500).send("Something went wrong");
}
});
我建议在模式模型中使用方法 例如,如果要验证密码,请添加方法
validPassword
loginSchema.methods.validPassword = function( pwd ) {
return ( this.password === pwd );
};
然后
loginSchema.findOne({ password: req.body.password }, function (err, login) {
if (err) { return done(err); }
if (!login) {
return done(null, false, { message: 'Incorrect login.' });
}
if (!login.validPassword(password)) {
return done(null, false, { message: 'Incorrect password.' });
}
return done(null, login);
});