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); res.cookie和res.render需要工作。
错误:发送后无法设置标头。 在SendStream.headersAlreadySent
如何将res.cookie和res.render一起发送或在多个响应中发送? 使用express似乎不可能,但可以使用node.js res.write或writeHead方法。
答案 0 :(得分:0)
res.cookie()
只是将cookie排队等待其他标题的最终响应(它与res.setHeader()
的操作类型相同),因此您显示的代码将同时发送cookie和渲染。它应该像你已经拥有它一样工作。
错误:发送后无法设置标头。在SendStream.headers已发送
现在您刚刚添加了您正在报告此特定错误的报告,您的代码中还有其他内容。您在问题中显示的两个函数调用本身不会导致此错误。该错误通常是由请求处理程序中的某些异步操作的错误处理引起的。有可能,您在异步操作完成之前调用res.render()
然后当异步操作完成时,您尝试然后发送标题,但是为时已晚,因为您已经渲染了页面并发送了响应,每个请求不能发送多个响应。
为了帮助您修复代码,我们需要查看包含这两个函数调用的整个请求处理程序的代码,然后我们可以帮助您正确修复。在没有看到代码的情况下,我们可以说的是,您在请求处理程序中处理异步操作的方式可能有错误。