2017-12-12 19 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); 
    }); 

원하는 결과 : 서버 응답 쿠키 및 렌더링 ('reports', sentToCJS); rescookie 및 res.render가 작동해야합니다.서버 response.cookie 및 response.render를 함께 보내는 방법은 무엇입니까?

오류 : 보낸 후 헤더를 설정할 수 없습니다. at SendStream.headersAlreadySent

어떻게 res.cookie와 res.render를 함께 보내거나 여러 답장으로 보낼 수 있습니까? 표현식에서는 가능하지 않지만 node.js res.write 또는 writeHead 메소드를 사용하면 가능합니다.

+0

두 문장은 단일 응답의 일부입니다. 두 가지 응답으로 무엇을 의미합니까? – Muthukumar

+0

@Muthukumar 오류 메시지 –

답변

0

res.cookie()은 다른 헤더 (궁극적으로는 res.setHeader()과 같은 작동 유형)의 최종 응답을위한 쿠키를 대기열에두기 때문에 표시되는 코드는 쿠키와 렌더링을 모두 보냅니다. 이미 가지고있는 것처럼 작동해야합니다.

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

최근에이 특정 오류가보고되는 것을 추가 했으므로 코드에 다른 문제가 있습니다. 질문에 표시되는 두 가지 함수 호출만으로는이 오류가 발생하지 않습니다. 이 오류는 일반적으로 요청 처리기에서 일부 비동기 작업을 잘못 처리하면 발생합니다. 비동기 작업이 완료되기 전에 res.render()으로 전화를 걸고 비동기 작업이 완료되면 헤더를 보내려고합니다. 그러나 이미 페이지를 렌더링하고 응답을 보냈기 때문에 너무 늦었습니다. 요청 당 하나 이상의 응답을 보냅니다.

코드를 수정하는 데 도움이되도록이 두 함수 호출을 포함하는 전체 요청 처리기 코드를 확인해야 올바른 픽스를 제공 할 수 있습니다. 코드를 보지 않고도 요청 처리기 내부에서 비동기 작업을 처리하는 방법에 오류가 있다고 말할 수 있습니다.

+0

아니요 작동하지 않습니다 ... 오류 메시지 –

+0

@ 21wesd34eqwfsdv 업데이트 - 오류 메시지가 표시되는 코드 줄로 인해 발생하지 않습니다. 일반적으로 잘못된 시간에 응답의 일부를 보내는 비동기 작업을 처리하는 방법에서 오류가 발생했기 때문입니다. 이 요청 처리기에 대한 모든 코드를보고 오류를 표시했는지 확인해야합니다. 그러나이 두 함수 호출이 차례대로 표시하면이 모든 오류가 발생하지 않습니다. 그 오류를 일으키는 다른 코드가 있습니다. – jfriend00

+0

@ 21wesd34eqwfsdv - 더 많은 코드를 포함 할 때까지 우리가 지금 알고있는 것에 대한 대답에 요약을 추가했습니다. – jfriend00