Мое приложение экспресс / реакция отлично работает в разработке, но по какой-то причине не подключается к моей производственной базе данных на 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, что они и есть.