使用bcrypt创建用户并进行身份验证

时间:2018-11-26 11:02:00

标签: node.js mongodb bcrypt

这是我的 user.js 文件,我在其中处理两个请求。

首先 POST / signup ,用户在其中输入电子邮件和密码,以便我可以将其存储在mongodb中。

var express = require("express");
const router = express.Router();
const mongoose = require("mongoose");
var bcrypt = require("bcrypt");
var jwt = require("jsonwebtoken");

var User = require("../models/user");

router.post("/signup", (req, res, next) => {
  User.find({ email: req.body.email })
    .exec()
    .then(user => {
      if (user.length >= 1) {
        return res.status(409).json({
          message: "Mail exists"
        });
      } else {
        bcrypt.hash(req.body.password, 10, (err, hash) => {
          if (err) {
            return res.status(500).json({
              error: err
            });
          } else {
            const user = new User({
              _id: new mongoose.Types.ObjectId(),
              email: req.body.email,
              password: hash
            });
            user
              .save()
              .then(result => {
                console.log(result);
                res.status(201).json({
                  message: "User created"
                });
              })
              .catch(err => {
                console.log(err);
                res.status(500).json({
                  error: err
                });
              });
          }
        });
      }
    });
});

第二个 POST / login ,用户在其中输入电子邮件,然后比较密码和bcrypt(如果密码与数据库中的密码匹配)。

router.post("/login", (req, res, next) => {
  User.find({ email: req.body.email })
    .exec()
    .then(user => {
      if (user.length < 1) {
        return res.status(401).json({
          message: "Auth failed"
        });
      }
      bcrypt.compare(req.body.password, user[0].password, (err, result) => {
        if (err) {
          return res.status(401).json({
            message: "Auth failed"
          });
        }
        if (result) {
          const token = jwt.sign(
            {
              email: user[0].email,
              userId: user[0]._id
            },
            process.env.JWT_KEY,
            {
                expiresIn: "1h"
            }
          );
          return res.status(200).json({
            message: "Auth successful",
            token: token
          });
        }
        res.status(401).json({
          message: "Auth failed"
        });
      });
    })
    .catch(err => {
      console.log(err);
      res.status(500).json({
        error: err
      });
    });
});

问题如下::每当我尝试使用邮递员创建用户 /注册时,请求均停留在“正在加载”状态,并且服务器关闭。

POSTMAN正文: { 'emial':'teste@gmail.com', '密码':'12345' }

服务器中的错误: UnhandledPromiseRejectionWarning:MongoNetworkError:首次连接时无法连接到服务器[node-rest-shop-shard-00-01-pbcph.azure.mongodb.net:27017]上的连接[MongoNetworkError:连接4到node-rest-shop-shard-00 -01-pbcph.azure.mongodb.net:27017超时]

(节点:1496)UnhandledPromiseRejectionWarning:未处理的承诺拒绝。引发此错误的原因可能是抛出了一个没有catch块的异步函数,或者是拒绝了一个.catch()无法处理的承诺。 (拒绝ID:1)

(节点:1496)[DEP0018] DeprecationWarning:已弃用未处理的承诺拒绝。将来,未处理的承诺拒绝将以非零退出代码终止Node.js进程。

1 个答案:

答案 0 :(得分:0)

User.find承诺被拒绝,因为Node无法连接到您的MongoDB实例。这个被拒绝的承诺将尝试执行遇到的第一个错误处理程序。在您的情况下,它找不到任何catch()来处理此错误。您可以通过在最后的Promise链中添加catch()来避免这种情况。 您还应该研究为什么Node实例无法成功连接到MongoDB实例。

router.post("/signup", (req, res, next) => {
  User.find({ email: req.body.email })
    .exec()
    .then(user => {
      if (user.length >= 1) {
        return res.status(409).json({
          message: "Mail exists"
        });
      } else {
        bcrypt.hash(req.body.password, 10, (err, hash) => {
          if (err) {
            return res.status(500).json({
              error: err
            });
          } else {
            const user = new User({
              _id: new mongoose.Types.ObjectId(),
              email: req.body.email,
              password: hash
            });
            user
              .save()
              .then(result => {
                console.log(result);
                res.status(201).json({
                  message: "User created"
                });
              })
              .catch(err => {
                console.log(err);
                res.status(500).json({
                  error: err
                });
              });
          }
        });
      }
    }).catch(err => {    //Handle the error here.
        console.log(err);
        res.status(500).json({
            error: err
        });
    });
});

您应该对登录呼叫执行相同的操作。