如何将服务器response.cookie和response.render一起发送?

时间:2017-12-12 05:02:30

标签: node.js http express cookies response

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方法。

1 个答案:

答案 0 :(得分:0)

res.cookie()只是将cookie排队等待其他标题的最终响应(它与res.setHeader()的操作类型相同),因此您显示的代码将同时发送cookie和渲染。它应该像你已经拥有它一样工作。

  

错误:发送后无法设置标头。在SendStream.headers已发送

现在您刚刚添加了您正在报告此特定错误的报告,您的代码中还有其他内容。您在问题中显示的两个函数调用本身不会导致此错误。该错误通常是由请求处理程序中的某些异步操作的错误处理引起的。有可能,您在异步操作完成之前调用res.render()然后当异步操作完成时,您尝试然后发送标题,但是为时已晚,因为您已经渲染了页面并发送了响应,每个请求不能发送多个响应。

为了帮助您修复代码,我们需要查看包含这两个函数调用的整个请求处理程序的代码,然后我们可以帮助您正确修复。在没有看到代码的情况下,我们可以说的是,您在请求处理程序中处理异步操作的方式可能有错误。