我的express / react应用程序在开发中运行良好,但由于某种原因无法连接到Mlab上的生产数据库。所有需要与DB交互的路由都返回503,服务不可用。
例如我正在将护照oauth2.0与Google一起使用进行登录-这会触发带有代码的回调,但由于我的回调尝试与数据库进行交互而挂起。需要从数据库中获取信息的其他任何路由都不会返回503。这是我的第一个应用程序,因此,我对所有这些都是陌生的,而且我不知道为什么它没有连接。我的mongo_uri与我的Google客户端ID和OAuth的机密一起设置为Heroku配置变量,并且我已经将服务器设置为在生产环境中使用这些密钥。
包括身份验证在内的所有开发工作都很好。我一直坚持这一观点,不知道为什么它无法连接,而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);
}
}
));
产品密钥设置:
// 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的正确性,以及在Heroku上针对prod DB的mlab用户凭据是否正确。