Express应用未在生产中连接到MongoDB-不知道为什么吗?

时间:2019-06-14 12:30:15

标签: node.js mongodb express heroku

我的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用户凭据是否正确。

0 个答案:

没有答案