Экспресс приложение не подключается к MongoDB на производстве - не знаете почему? - PullRequest
2 голосов
/ 14 июня 2019

Мое приложение экспресс / реакция отлично работает в разработке, но по какой-то причине не подключается к моей производственной базе данных на Mlab.Все маршруты, требующие взаимодействия с БД, возвращают 503, служба недоступна.

например, я использую паспорт oauth2.0 с Google для входа в систему - это вызывает обратный вызов с кодом, но затем зависает, потому что мой обратный вызов пытается взаимодействовать с БД.Любые другие маршруты, которые требуют извлечения информации из БД, не возвращая 503. Это мое первое приложение, так что я новичок во всем этом, и я не знаю, почему он не подключается.Мой mongo_uri настроен как конфигурационная переменная Heroku, наряду с моим идентификатором клиента google и секретом для OAuth, и я настроил сервер для использования этих ключей в работе.

В разработке все работает нормально, включаяаутентификация.Я застрял на этом, понятия не имею, почему он не подключается, и журналы Heroku тоже не помогают.Пожалуйста, помогите!

Маршруты аутентификации:

    app.get('/auth/google',
    passport.authenticate('google', { scope: ['profile', 'email'] }));

  app.get('/auth/google/callback',
    passport.authenticate('google'), (req, res) => {
      // Successful authentication, redirect home.
      res.redirect('/cabinet');
    });

Настройка стратегии аутентификации:

const passport = require('passport');
const GoogleStrategy = require('passport-google-oauth20').Strategy;
const keys = require('../config/keys');
const mongoose = require('mongoose');

// Creates an instance of our user class (DB collection).
const User = mongoose.model('users');

// Sets a token for passport to pass as a cookie to the browser
passport.serializeUser((user, done) => {
  done(null, user.id);
});

// Takes the incoming token from the cookie and finds the associated user.
passport.deserializeUser((id, done) => {
  User.findById(id).then(user => {
    done(null, user);
  });
});


// Set up the google strategy
passport.use(new GoogleStrategy({
  clientID: keys.googleClientID,
  clientSecret: keys.googleClientSecret,
  callbackURL: "/auth/google/callback",
  proxy: true
},
  async (accessToken, refreshToken, profile, done) => {
    const existingUser = await User.findOne({ googleId: profile.id });

    if (existingUser) {
      // We already have a record with the given profile ID
      done(null, existingUser);
    } else {
      // We don't have a user record with this ID, make a new record.
      const user = await new User({ googleId: profile.id }).save();
      done(null, user);
    }
  }
));

Настройка ключей Prod:

// Production keys
module.exports = {
  googleClientID: process.env.GOOGLE_CLIENT_ID,
  googleClientSecret: process.env.GOOGLE_CLIENT_SECRET,
  mongoURI: process.env.MONGO_URI,
  cookieKey: process.env.COOKIE_KEY
};

Логика производственных ключей:

if (process.env.NODE_ENV === 'production') {
  // we are in production - return the prod set of keys
  module.exports = require('./prod');
} else {
  // we are in development - return the dev set of keys
  module.exports = require('./dev');
}

Я также дважды проверил, что mongoURI верен и что мои учетные данные пользователя mlab для базы данных prod верны на Heroku, что они и есть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...