如何使用节点js生成cookie?

时间:2018-08-20 11:26:12

标签: javascript jquery node.js cookies passport.js

如何使用节点js生成cookie,我正在使用express-session节点插件来生成cookie。请告诉我我做错了什么地方

安装express-session插件

app.js

const session = require('express-session');

app.use(session({
    secret: 'asdassadsazz',
    resave: true,
    saveUninitialized: true,
    //cookie: { secure: true }
}));

app.use(passport.initialize());
app.use(passport.session());

passport.js

passport.serializeUser(function(id, done) {
    console.log('ddd');
//    console.log(user);
    done(null, id);
});

passport.deserializeUser(function(id, done) {
    User.findById(id, function (err, user) {
        done(err, user);
    });
});

controller.js

 register: async (req, res, next) => {
        console.log(req.body);
        try {
            const result = await db.User.create({
                email: req.body.email,
                password: req.body.password
            })

           console.log(result.id);
            req.login(result.id,function () {
                res.json({message:"Registration successfully"});

            })
        } catch (e) {
            console.log(e)
        }

    },

它应该生成cookie并存储在浏览器中,但不会生成任何cookie。enter image description here

enter image description here

服务器日志

Executing (default): SHOW INDEX FROM `Users` FROM `sql12252060`
app is running on 5000
OPTIONS /users/register 204 1.943 ms - 0
{ email: 'a@g.com', password: '1' }
email element
Executing (default): INSERT INTO `Users` (`id`,`email`,`password`) VALUES (DEFAULT,'a@g.com','$2a$10$zhTaqEbEeMOaD8F..CQYRufALc5dD4l899qMKRw0QRxIWvrPMSlpq');
17
ddd
POST /users/register 200 932.036 ms - 39

是不同域的问题。我的服务器在5000端口上运行,而客户端在3000端口上运行

2 个答案:

答案 0 :(得分:0)

    Please note that secure: true is a recommended option. However, it requires an https-enabled website, i.e., HTTPS is necessary for secure cookies. If secure is set, and you access your site over HTTP, the cookie will not be set. If you have your node.js behind a proxy and are using secure: true, you need to set "trust proxy" in express:

   var app = express()
  app.set('trust proxy', 1) // trust first proxy
  app.use(session({
  secret: 'keyboard cat',
  resave: false,
  saveUninitialized: true,
  cookie: { secure: true }
}))

答案 1 :(得分:0)

resave选项应为false。 重新保存: 强制将会话保存回会话存储,即使在请求期间从未修改过会话也是如此。根据您的商店,这可能是必需的,但它也可能创建竞争条件,即客户端向您的服务器发出两个并行请求,并且在另一个请求结束时,即使没有进行任何更改,一个请求中对会话所做的更改也可能被覆盖(此行为还取决于您使用的商店)。

默认值为true,但已弃用默认值,因为将来会更改默认值。请研究此设置,然后选择适合您的用例的内容。通常,您会想要false。

我怎么知道这对于我的商店是否必要?最好的了解方法是与您的商店核实是否实现了touch方法。如果是这样,则可以安全地设置resave:false。如果它没有实现touch方法,并且您的商店在存储的会话中设置了过期日期,那么您可能需要重新保存:true。