UnhandledPromiseRejectionWarning: необработанное отклонение обещания на сервере nodejs - PullRequest
0 голосов
/ 14 января 2019

Я пытаюсь использовать почтальон в первый раз, и да, я новичок с этой аутентификацией. У меня есть страница регистрации и страница входа в angular, и мой бэкэнд работает на другом порту, который закодирован в nodejs. Поэтому я установил паспорт и другие необходимые пакеты для аутентификации при входе и регистрации пользовательского процесса. Но при отправке запроса на регистрацию маршрута для регистрации пользователя я получаю ошибку UnhandledPromiseRejectionWarning. Несмотря на то, что есть и поймать внутри маршрута, он все еще дает эту ошибку, из-за которой я запутался. Данные, которые я отправляю, являются совершенными, но ошибка происходит на стороне сервера. Вот мой файл app.js, который содержит все маршруты

var express = require('express');
var mongoose = require('mongoose');
var bodyparser = require('body-parser');
var cors = require('cors');
var session = require('cookie-session');
var flash = require('connect-flash');
var passport = require('passport');
var bcrypt = require('bcryptjs');

require('./config/passport')(passport);

var User = require('./models/User');
var app = express();

app.use(bodyparser.json());
app.use(cors());
var expiryDate = new Date(Date.now() + 60 * 60 * 1000) // 1 hour
app.use(session({
  name: 'session',
  keys: ['key1', 'key2'],
  cookie: {
    secure: true,
    httpOnly: true,
    domain: 'example.com',
    path: 'foo/bar',
    expires: expiryDate
  }
}))
app.set('port', process.env.port || 3000);
app.use(passport.initialize());
app.use(passport.session());


// Connect flash
app.use(flash());

// Global variables
app.use(function(req, res, next) {
  res.locals.success_msg = req.flash('success_msg');
  res.locals.error_msg = req.flash('error_msg');
  res.locals.error = req.flash('error');
  next();
});

var db = mongoose.connect("mongodb://localhost:27017/server", {
  useNewUrlParser: true
}, function(err, response) {
  if (err) {
    console.log('There is error in connecting with mongodb');
  }
  console.log('Connection has been established.');
});

app.get('/', (req, res) => {
  res.send("hello");
});


//Trying registering with passport

app.post('/register', (req, res) => {
    console.log(req.body);
    debugger;
    const { firstname, lastname, email, password } = req.body;
    let errors = [];

    if (errors.length > 0) {
      res.render('register', {
        errors,
        name,
        email,
        password,
        password2
      });
    } else {
      User.findOne({ email: email }).then(user => {
        if (user) {
          errors.push({ msg: 'Email already exists' });
          res.render('register', {
            errors,
            firstname,
            lastname,
            email,
            password
          });
        } else {
          const newUser = new User({
            firstname,
            lastname,
            email,
            password
          });

          bcrypt.genSalt(10, (err, salt) => {
            bcrypt.hash(newUser.password, salt, (err, hash) => {
              if (err) throw err;
              newUser.password = hash;
              newUser
                .save()
                .then(user => {
                  req.flash(
                    'success_msg',
                    'You are now registered and can log in'
                  );
                  res.redirect('/login');
                })
                .catch(err => console.log(err));
            });
          });
        }
      });
    }
  });

//end


app.post('/login', (req, res, next) => {
    console.log(req.body);
    passport.authenticate('local', {
      successRedirect: '/dashboard',
      failureRedirect: '/login',
      failureFlash: true
    })(req, res, next);
  });


app.listen(app.get('port'), function(err, response) {
    console.log("Server is running");
});

файл passport.js в папке конфигурации

const LocalStrategy = require('passport-local').Strategy;
const mongoose = require('mongoose');
const bcrypt = require('bcryptjs');

// Load User model
const User = require('../models/User');

module.exports = function(passport) {
  passport.use(
    new LocalStrategy({ emailField: 'email' }, (email, password, done) => {
      // Match user
      User.findOne({
        email: email
      }).then(user => {
        if (!user) {
          return done(null, false, { message: 'That email is not registered' });
        }

        // Match password
        bcrypt.compare(password, user.password, (err, isMatch) => {
          if (err) throw err;
          if (isMatch) {
            return done(null, user);
          } else {
            return done(null, false, { message: 'Password incorrect' });
          }
        });
      });
    })
  );

  passport.serializeUser(function(user, done) {
    done(null, user.id);
  });

  passport.deserializeUser(function(id, done) {
    User.findById(id, function(err, user) {
      done(err, user);
    });
  });
};

1 Ответ

0 голосов
/ 14 января 2019

Чтобы решить эту конкретную проблему, вам нужно предоставить catch() при выполнении User.findOne() на том же уровне, что и самый внешний then():

User.findOne({ email: email })
  .then(user => { /* existing code */})
  .catch(err => console.log(err)); // add catch()

И

// Match user
User.findOne({ email: email })
  .then(user => { /* existing code */ })
  .catch(err => console.log(err)); // add catch()

По поводу проблемы с двигателем. Вам нужно указать движок рендеринга, такой как pug или html или ejs, это то, что ожидает Express как фреймворк. Ссылка, которую вы указали, на которой основан этот код, использует механизм рендеринга, в частности ejs. Это видно из использования res.render(), который визуализирует шаблоны из папки «views».

app.set('view engine', 'ejs');

Даже с движком рендеринга, настройка не требует рендеринга шаблонов. Пока вы удаляете res.render() и вместо этого просто используете res.send() или эквивалентный, вы можете использовать это приложение Express в качестве API.

Если вы намерены НЕ использовать шаблоны, а по-прежнему воспроизводить встроенные угловые файлы, вам необходимо обновить код и удалить все экземпляры res.render() и res.redirect(). Вместо этого вы можете, по-прежнему настраивая механизм просмотра для удовлетворения Express, сделать что-то из следующего:

// towards top of file
app.use(express.static(path.join(__dirname, 'path/to/built/angular')));

// ...

// after all other routes
app.get('*', (req, res) =>{
  res.sendFile(path.join(__dirname+'/path/to/built/angular/index.html'));
});

Надеюсь, это поможет!

...