使用koa无法在cookie中设置uid-safe令牌

时间:2015-11-23 12:33:25

标签: cookies koa

我使用的是节点版本5.0.0,uid-safe版本2.0.0和koa版本1.1.2

我的问题是我尝试使用uid-safe生成令牌并将其另存为cookie然后检索cookie并将其显示在控制台中。

程序生成令牌ok,但是当我尝试使用

设置cookie时
this.cookies.set(cookieName, token);

它似乎挂起没有显示错误消息。 并且之后的行应显示"过去设置cookie永远不会显示"。

var koa = require('koa');
var app = module.exports = koa();
var uid = require('uid-safe');

app.use(function *() {
    var cookieName = 'koa.sid';
    uid(18).then(function(token) {
        console.log("token: " + token);  // token: 0bk6D3CFtGJgQ5HmiANFnosC
        this.cookies.set(cookieName, token);
        console.log("Got past setting the cookie"); // this never gets shown
        retrievedToken = this.cookies.get(cookieName);
        console.log(cookieName + ': ' + retrievedToken);
    });
});

if (!module.parent) app.listen(3000);

1 个答案:

答案 0 :(得分:3)

this.cookies.set()会抛出异常,但由于您的保证链中没有.catch()子句,该异常会丢失(uid(18).then(...).catch(...))。

例外是:

TypeError: Cannot read property 'set' of undefined

那是因为this不是正确的上下文(对于所有意图和目的,如果不绑定传递给.then()的回调函数,则应该认为它是未定义的。)

由于您使用的是生成器功能,因此可以改为使用yield

app.use(function *(next) {
  var cookieName = 'koa.sid';
  var token      = yield uid(18);

  console.log("token: " + token);
  this.cookies.set(cookieName, token);
  console.log("Got past setting the cookie");
  ...
  yield next;
});

此外,this.cookies.get()将无效,因为(AFAIK)它只会获取通过请求传递的cookie值(而您将cookie设置为响应的一部分)。