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

Using koa can't set uid-safe token in a cookie

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

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

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

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

它似乎只是挂起,没有显示任何错误消息。 之后的行应显示 "Got past setting the cookie never gets shown".

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);

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() 将不起作用,因为(据我所知)它只会获取通过请求传入的 cookie 值(而您将 cookie 设置为响应的一部分)。