UnhandledPromiseRejectionWarning:nodejs服务器中未处理的诺言拒绝

时间:2019-01-14 18:12:55

标签: node.js angular typescript passport.js bcrypt

我正在尝试首次使用邮递员,是的,我是使用此身份验证的初学者。我有一个用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");
});

config文件夹中的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 :(得分:1)

要解决此特定问题,在与最外层var up = null; var down = null; // Get in which part of page the scroll started and where it should go if going up or down function div(x) { // If called by html element, get only the id if( x.id ) { x = x.id; } switch(x) { case 's1': up = null; down = 's2'; break; case 's2': up = 's1'; down = 's3' break; case 's3': up = 's2'; down ='s4'; break; case 's4': up = 's3'; down = null; break; default: up = null; down = null; break; } } window.addEventListener('wheel', function(e) { e.preventDefault(); // Prevent default scrolling // If scrolling UP and there's something up if (e.deltaY < 0 && up) { // scroll the desired div to view document.getElementById(up).scrollIntoView(); // call div() again to refresh id's/position in case cursor hasnt moved and refreshed already div(up); } // same but scrolling down if (e.deltaY > 0 && down) { document.getElementById(down).scrollIntoView(); div(down); } }); 处于同一级别执行<div id='s1' onmouseover="div(this)"> <!--content--> </div> <div id='s2' onmouseover="div(this)"> <!--content--> </div> <div id='s3' onmouseover="div(this)"> <!--content--> </div> <div id='s4' onmouseover="div(this)"> <!--content--> </div> 时,需要提供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,这是Express框架所期望的。您提供的基于该代码的链接使用的是渲染引擎,特别是ejs。从html的使用中可以明显看出这一点,它从“视图”文件夹中呈现了模板。

ejs

即使使用渲染引擎,设置您实际上也不需要渲染任何模板。只要删除res.render(),而只使用app.set('view engine', 'ejs'); 或等效的语言,您就可以将此Express应用程序用作API。

如果您打算不使用模板,但仍渲染已构建的角度文件,则需要更新代码并删除res.render()res.send()的所有实例。相反,您仍然可以设置视图引擎来满足Express的要求,请执行以下操作:

res.render()

希望有帮助!