我现在才开始学习nodejs,我编写了用于登录的api,并使用bcrypt npm对密码进行了加密。现在,我想验证电子邮件和密码。逻辑应该是这样的:只有注册用户才有资格登录,并且给定的密码也应该匹配。注册时该密码必须相同。
这两个条件要相互匹配,它在控制台中会显示错误消息,例如:如果电子邮件地址错误,则必须显示“找不到用户”。如果他输入了错误的密码,则必须显示“请输入有效的密码”。如果两者都正确,则必须显示“用户已成功登录”。
如果我不确定是否有疑问,请发表评论。
这是登录Api:
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);
});
这是架构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;
答案 0 :(得分:0)
我在medium上找到了解决方案。您可以编写一个“验证”功能并在搜索数据库之前检查电子邮件。
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);
...
}
答案 1 :(得分:0)
首先,我们需要找到具有给定电子邮件的用户。 如果用户不是虚假的,那么我们需要将给定的密码与找到的用户的密码进行比较。如果相等,则登录成功。
您可以使用以下路线:
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");
}
});
答案 2 :(得分:0)
我建议在模式模型中使用方法 https://mongoosejs.com/docs/guide.html#methods
例如,如果要验证密码,请添加方法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);
});