Создайте пользователя с помощью bcrypt и аутентифицируйтесь - PullRequest
0 голосов
/ 26 ноября 2018

Это мой 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
      });
    });
});

Проблема заключается в следующем: Всякий раз, когда я пытаюсь создать пользователя / signup с помощью почтальона, запрос остается в "loading"и сервер выключается.

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 ().(идентификатор отклонения: 1)

(узел: 1496) [DEP0018] Предупреждение об устаревании: отклонение необработанного обещания не рекомендуется.В будущем отклонения обещаний, которые не обрабатываются, завершат процесс Node.js с ненулевым кодом завершения.

1 Ответ

0 голосов
/ 26 ноября 2018

Обещание User.find отклонено, поскольку Node не может подключиться к вашему экземпляру MongoDB.Это отклоненное обещание пытается выполнить первый обработчик ошибок, с которым он сталкивается.В вашем случае не удается найти catch () для обработки этой ошибки.Вы можете избежать этого, добавив 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
        });
    });
});

Вы должны сделать то же самое для вашего входа в систему.

...