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

UnhandledPromiseRejectionWarning: Unhandled promise rejection in nodejs server

我是第一次尝试使用邮递员,是的,我是这种身份验证的初学者。我在 angular 中有一个注册页面和一个登录页面,我的后端是 运行 在另一个用 nodejs 编码的端口上。所以我已经为登录身份验证和注册用户过程安装了护照和其他必需的包。但是在发送注册用户注册路由的请求时,我收到 UnhandledPromiseRejectionWarning 错误。即使有 then and catch inside the route 它仍然给出这个错误,因为我很困惑。我发送的数据是完美的,但错误发生在服务器端。 这是我的 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);
    });
  });
};

要解决此特定问题,您需要在与最外层 then():

相同级别执行 User.findOne() 时提供一个 catch()
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()

关于引擎的问题。您需要指定渲染引擎,例如 pughtmlejs,这是 Express 作为框架所期望的。 link 你提供的你基于此代码的是使用渲染引擎,特别是 ejs。这从 res.render() 的使用中可以明显看出,它从 "views" 文件夹呈现模板。

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

即使使用渲染引擎设置,您实际上也不需要渲染任何模板。只要您删除 res.render() 而只是使用 res.send() 或等效项,您就可以将此 Express 应用程序用作 API.

如果您的意图是不使用模板但仍呈现构建的 angular 文件,则需要更新代码并删除 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'));
});

希望对您有所帮助!