cookies - 使用 Supertest 时 request.cookies 未定义

标签 cookies nestjs supertest

我通过 NestJS API 中的 HTTP-Only cookie 传递我的身份验证 token 。

因此,在为我的 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 中。 .

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

如果我从 Postman 测试相同的功能,一切都会按预期进行。我究竟做错了什么?

最佳答案

我知道这是一个旧线程,但是...
我也有 req.cookies 未定义,但出于不同的原因。
我正在独立测试我的路由器,而不是顶级应用程序。所以我在 beforeEach 中引导应用程序并添加要测试的路由。
我得到 req.cookies 未定义,因为 express 4 需要存在 cookieParser 中间件来解析来自标题的 cookie。
例如。


const express           = require('express');
const bodyParser        = require('body-parser');
const cookieParser      = require('cookie-parser');
const request           = require('supertest');

const {router}  = require('./index');

describe('router', () => {
    let app;    
    
    beforeAll(() => {        
        app  = express();
        app.use(bodyParser.json());
        app.use(bodyParser.urlencoded({ extended: true }));
        app.use(cookieParser());
        app.use('/', router);
    });

    beforeEach(() => jest.clearAllMocks());

    it('GET to /', async () => {
        const jwt = 'qwerty-1234567890';
        
        const resp = await request(app)
            .get('/')
            .set('Cookie', `jwt=${jwt};`)
            .set('Content-Type', 'application/json')
            .send({});        
    });
    
});

以这种方式进行测试使我可以在独立于应用程序的情况下对路由器进行单元测试。 req.cookies 按预期出现。

关于cookies - 使用 Supertest 时 request.cookies 未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60019431/

相关文章:

cookies - 如何将 Scrapy 登录 cookie 传递给 Selenium?

javascript - 如何使用 cookie 或 localStorage 记住 div 的打开/关闭状态?

javascript - 如何在 NestJS 中记录所有 Axios 外部 http 请求

javascript - Nest无法解析自定义服务的依赖关系

Javascript 问题

javascript - Cookie 无法被脚本读取

typescript - NestJS 无法解析 UserController 的依赖关系

node.js - 类型错误 : Cannot read properties of undefined (reading 'listen' ) when testing with Jest, super 测试、Express、Typescript

node.js - 用 Nock 进行模拟,删除

node.js - 测试在 Node 中使用 mocha/supertest 重定向的请求