request.cookies在使用Supertest时未定义

问题描述 投票:1回答:1

我正在通过NestJS API中的仅HTTP cookie传递身份验证令牌。

同样,当为我的Auth端点编写一些E2E测试时,我遇到了cookie不在我期望的位置的问题。

以下是我的简化测试代码:

describe('auth/logout', () => {
  it('should log out a user', async (done) => {
    // ... code to create user account

    const loginResponse: Response = await request(app.getHttpServer())
                                              .post('/auth/login')
                                              .send({ username: newUser.email, password });

    // get cookie manually from response.headers['set-cookie']
    const cookie = getCookieFromHeaders(loginResponse);

    // Log out the new user
    const logoutResponse: Response = await request(app.getHttpServer())
                                            .get('/auth/logout')
                                            .set('Cookie', [cookie]);

  });
});

在我的JWT策略中,我正在使用自定义cookie解析器。我遇到的问题是request.cookies到达解析器时始终为undefined。但是,该cookie将出现在request.headers中。

我正在阅读这篇中型文章https://medium.com/@juha.a.hytonen/testing-authenticated-requests-with-supertest-325ccf47c2bb中的手动cookie示例,并且在请求对象上似乎没有任何其他方法可以设置cookie。

如果我测试Postman的相同功能,一切都会按预期工作。我在做什么错?

cookies nestjs supertest
1个回答
0
投票

根据您关注的文章,代码位于https://medium.com/@juha.a.hytonen/testing-authenticated-requests-with-supertest-325ccf47c2bb:1)在.set('cookie', cookie)中使用小写形式的“ cookie”值,在您的代码中使用Pascal大小写==> 您是否尝试过在代码中使用小写形式?2)分配给'cookie'标头的cookie值不是数组,而在您的代码中分配的是数组==> 您是否尝试过使用非数组值?

因此,您可以尝试使用以下代码:

describe('auth/logout', () => {
  it('should log out a user', async (done) => {
    // ... code to create user account

    const loginResponse: Response = await request(app.getHttpServer())
                                              .post('/auth/login')
                                              .send({ username: newUser.email, password });

    // get cookie manually from response.headers['set-cookie']
    const cookie = getCookieFromHeaders(loginResponse);

    // Log out the new user
    const logoutResponse: Response = await request(app.getHttpServer())
                                            .get('/auth/logout')
                                            .set('cookie', cookie) // <== here goes the diff
                                            .expect(200, done);

  });
});

让我们知道是否有帮助:)

© www.soinside.com 2019 - 2024. All rights reserved.