2016-12-11 25 views
0

nodejsでpassportjsを使用すると、データベースに挿入しようとすると504エラーが発生します。mongoデータベースへの挿入時にエラーが発生しました

mongoデータベースはアプリケーションサーバーから外部にホストされ、アプリケーションはリバースプロキシの背後にあります(リバースプロキシはアプリケーションポートをポート80に変換します)。これがなぜ起こるか

passport.use(new GoogleStrategy({ 
    clientID: "client_id", 
    clientSecret: "client_secret", 
    callbackURL: "oauth_url_callback" 
    }, 
    function(accessToken, refreshToken, profile, done) { 
    passport.serializeUser(function(user,done){ 
     mongo.connect(url, function(err,db){ 
     if(err){ 
      console.log(err, ' was the err'); 

      fs.open('views/debug/debug.txt', 'rw', 'a+', function(err,data){ 
      fs.writeFileSync('views/debug/debug.txt', err); 
      }); 

      done(err); 
     } else { 
      db.collection('users').find({profile:profile}, function(err, user) { 
      if (err) { 
       fs.open('views/debug/debug.txt', 'rw', 'a+', function(err,data){ 
       fs.writeFileSync('views/debug/debug.txt', err); 
       }); 

       db.collection('users').insertOne({profile:profile, name:"John Doe"}, function(err, user){ 
       if(err){ 
        console.log("failed to insert", err); 
       } else { 
        console.log('Registered a new user!'); 
       } 
       }); 
      } else { 
       console.log('We have a returning user!'); 
      } 

      console.log('testing'); 

      fs.open('views/debug/debug.txt', 'rw', 'a+', function(err,data){ 
       fs.writeFileSync('views/debug/debug.txt', err); 
      }); 

      done(null, user); 
      }); 
     } 
     }); 
    }); 
    } 
)); 

私はわかりませんが、あなたがデータベースに挿入しようとすると、それだけで起こる:

問題は、Mongoのドキュメントに挿入しようとしたときに起こります。ページをリフレッシュすると、トークンの有効期限が切れているというエラーが返されるため、504は表示されません。

また、エラーのログを記録しようとしましたが、エラーはないようです。出力を抽出するための引数としてstdoutとstderrorの両方でプロセスを開始しますが、役に立たないものです。

また、奇妙なデータベースにドキュメント/アイテムを挿入しません。

+1

504はゲートウェイタイムアウトです。プロキシが誤ってmongoポートを転送しようとしていますか?あなたはあなたのアプリケーションサーバからmongoサーバにpingできますか? – ppovoski

+0

mongoサーバーはmlabでホストされており、mongoサーバーへの要求はアプリケーションサーバー上で行われます。私はそれがこれをどうやってできるのか見ていない。私はそれに直接アクセスすることができたと思うけど、私はcloudflareを使用しているので、私のセットアップは別のリバースプロキシの背後にあるはずだ。 – Jacob

答えて

0

私はdone関数を両方のコールバックで2回定義することになりました。私はそれぞれを別々に定義し、それらを別々に呼びました。

関連する問題