2017-12-12 12 views
-2
app.get("/auth/google", passport.authenticate("google", { 
    session: false, 
    scope: ["profile", "email"] 
})); 

passport.use(new GoogleStrategy({ 
     clientID: " x", 
     clientSecret: " y", 
     callbackURL: "http://localhost:3000/auth/google/callback" 
    }, 
    function(accessToken, refreshToken, Gprofile, done) { 
     process.nextTick(function() { 

      Gdata = { 
       'id': Gprofile.id, 
       'name': Gprofile.displayName, 
       'profileImage': Gprofile.photos[0].value, 
       'gender': Gprofile.gender, 
       'email': Gprofile.emails[0].value 
      }; 

      console.log('Gdata recieved'); 
      console.log('--------------------------------------------------------------------------'); 

      return done(null, true); //It seems redirects to failureRedirect or successRedirect. 
     }); 
    } 
)); 

app.get("/auth/google/callback", passport.authenticate('google', { 
    session: false, 
    failureRedirect: "/google_callback_fail", 
    successRedirect: "/reports" 
})); 

app.get("/reports", function(req, res) { 
    // ------------DB 
    var db = require('../model/connection.js'); 
    var stmt; 

    var name = Gdata.name.split(" "); 
    stmt = "INSERT INTO User(`first_name`, `last_name`, `email`) VALUES (?,?,?)"; 


    var x = new Promise(function(resolve, reject) { 
     var sentToCJS; 
     db.query(stmt, [name[0], name[1], Gdata.email], function(err, rows) { 
      if (err) reject(err); 

      PAYLOAD = { userID: rows.insertId }; 

      ENCODED_JWT = _jwt.sign(PAYLOAD, 'secret', { expiresIn: EXP_TIME }); 
      console.log("1 ENCODED_JWT:", ENCODED_JWT); 


      sentToCJS = { 
       'jwt': ENCODED_JWT, 
       'name': Gdata.name, 
       'profileImage': Gdata.profileImage, 
       'gender': Gdata.gender, 
       'email': Gdata.email 
      }; 
      console.log("sentToCJS:", sentToCJS); 

      //creates persistant cookie. 
       res.cookie("jwt", ENCODED_JWT, { 
       maxAge: 604800, //7days to ms 
       httpOnly: true, 
       sameSite: true, 
       signed: true //detects if user has modified the cookie 
      }); 

      resolve(sentToCJS); 
     }); 

    }); 

    x.then(function(sentToCJS) { 
     res.render('reports', sentToCJS); 
    }); 


    x.catch(function(error) { 
     console.log("error", error); 
    }); 

希望の結果:サーバーの応答cookieとレンダリング( 'reports'、sentToCJS); rescookieとres.renderが動作する必要があります。 どのようにサーバーのresponse.cookieとresponse.renderを一緒に送信するのですか?

エラー:送信後にヘッダーを設定できません。 at SendStream.headersAlreadySent

res.cookieとres.renderをまとめて、または複数のレスポンスで送信するにはどうすればよいですか? expressでは可能ではないようですが、node.js res.writeまたはwriteHeadメソッドで可能です。

+0

これらの2つのステートメントは、単一の応答の一部です。あなたは2つの応答によって何を意味しますか? – Muthukumar

+0

@Muthukumarエラーメッセージ –

答えて

0

res.cookie()は、他のヘッダー(これはres.setHeader()と同じタイプの操作です)の最終的な応答のためにクッキーをキューに入れるだけで、表示するコードはクッキーとレンダリングの両方を送信します。あなたはすでにそれを持っているので、それは動作するはずです。

Error: Can't set headers after they are sent. at SendStream.headers Already Sent

この特定のエラーが報告されていることを最近お知らせしましたので、あなたのコードに何か他のことがあります。あなたの質問に表示される2つの関数呼び出しは、それだけではこのエラーを引き起こしません。このエラーは、通常、リクエストハンドラで非同期操作が正しく処理されないことが原因です。非同期操作が完了する前にres.render()と呼んでいる可能性があります。非同期操作が完了すると、ヘッダーを送信しようとしますが、既にページをレンダリングして応答を送信しているため、要求ごとに複数の応答を送信する。

コードを修正するには、これらの2つの関数呼び出しを含むリクエストハンドラ全体のコードを確認してから、適切な修正を行うことができます。コードを見ることなく、リクエストハンドラ内で非同期操作をどのように処理しているかにはおそらくエラーがあると言えます。

+0

いいえ動作しません...エラーメッセージ –

+0

@ 21wesd34eqwfsdvを更新しました - このエラーメッセージは表示されているコード行だけに起因するものではありません。これは、通常、間違った時間に応答の一部を送信している非同期操作をどのように処理するかというエラーが原因です。このエラーが発生したことを示すために、このリクエストハンドラのすべてのコードを確認する必要があります。しかし、このように2つの関数呼び出しを1つずつ表示すると、あなた自身でエラーが発生することはありません。そのエラーの原因となる他のコードがあります。 – jfriend00

+0

@ 21wesd34eqwfsdv - コードを追加するまで私が今知っていることの私の答えに要約を追加しました。 – jfriend00

関連する問題