Node.js 如何在登录nodejs时验证电子邮件和密码

Node.js 如何在登录nodejs时验证电子邮件和密码,node.js,Node.js,我现在刚开始学习nodejs,我编写了用于登录的api,我使用bcrypt npm加密了密码。现在我想验证电子邮件和密码。逻辑应该是这样的:只有注册用户才有资格登录,并且给定的密码也应该匹配。此密码在他或她注册时必须相同 这两个条件要匹配其他条件,它在控制台中显示错误消息,如此,如果电子邮件地址错误,则必须显示“未找到用户”。如果他输入了错误的密码,则必须显示“请输入有效密码”。如果两者都正确,则必须显示用户已成功登录 如果我不清楚我的疑问,请发表评论 这是登录Api: app.post("/a

我现在刚开始学习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);
  });
这是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);
    });