Node.js Cookie在supertest/superagent测试中持续存在,但用户不';不要一直登录 我的目标

Node.js Cookie在supertest/superagent测试中持续存在,但用户不';不要一直登录 我的目标,node.js,express,jestjs,passport.js,superagent,Node.js,Express,Jestjs,Passport.js,Superagent,我试图在每次测试之前使用supertest的agent函数在一个玩笑中beforeach()登录用户,因为我希望每个测试都在用户登录的假设下运行。对于身份验证,我使用passport和passport local 这是我尝试过的(为了简洁起见,部分被裁剪): 测试文件: import { agent, SuperAgentTest } from 'supertest'; import app from '../../src/app'; // create a `testRequest` va

我试图在每次测试之前使用supertest的
agent
函数在一个玩笑中
beforeach()
登录用户,因为我希望每个测试都在用户登录的假设下运行。对于身份验证,我使用passport和passport local


这是我尝试过的(为了简洁起见,部分被裁剪): 测试文件:

import { agent, SuperAgentTest } from 'supertest';
import app from '../../src/app';

// create a `testRequest` variable to use in the tests
// that will be refreshed in between
let testRequest: SuperAgentTest;

const fakeUser = { email: 'john@john', username: 'john', password: 'john' };

beforeEach(async () => {
  // create new agent
  testRequest = agent(app);

  // register and login
  await testRequest.post('/register').send(fakeUser).expect(302);

  // other irrelevant stuff...
});

// protected route
describe('POST /campgrounds/new', () => {
  it('returns 200 OK', () => {
    return testRequest.get('/campgrounds/new');
  })
});
/register
路线:

router.post('/register', async (req, res) => {
  const { password, ...details } = req.body;
  try {
    // I am using passport-local-mongoose for this function-
    // it just registers the user
    const user = await User.register(new User(details), password);
    req.login(user, (err) => {
      // error handling and redirect
    });
  } catch (e) {
    // error handling
  }
})

这是我的结果 我的状态不是200,而是302,这意味着我被重定向到登录页面。为了调试它,我创建了一个名为
/current
的测试路由,它将记录当前用户和会话ID cookie。然后,我分别在
it
beforeach
函数中向该路由发送
GET
请求

有趣的是,它们都记录了相同的会话ID,但只有在每个之前的
中的请求附加了一个用户对象。

\1确保主体解析器的顺序正确 在进行任何路由或身份验证相关操作之前,请确保已完成此操作

app.use(express.json())
#2.检查接线 确保在任何
应用程序之前调用
app.use(passport.initialize())
app.use(passport.session())
。使用('/',aRouter)
路由器.get
路由器.post
等:

//使用特定配置设置会话
应用程序使用(会话)({
秘密:“Bkuyqueajhbd”,
雷萨夫:是的,
saveUninitialized:true,
存储:新文件存储({path:'/tmp/session'})
}));
//把电线接上
app.use(passport.initialize())
app.use(passport.session())
编辑:关于
req.user
Passport用于在会话中存储用户ID

对服务器的每个请求都必须从数据库重新加载用户。 这是中间件
passport.initialize()
passport.session()
的工作

那里的逻辑将调用
passport.deserializeUser
以按ID查找用户-与通过
passport.serializeUser
登录会话时保存的ID相同

passport.serializeUser(函数(用户,完成){
完成(null,user.id);//#1确保正文解析器的顺序正确
在进行任何路由或身份验证相关操作之前,请确保已完成此操作

app.use(express.json())
#2.检查接线 确保在任何
应用程序之前调用
app.use(passport.initialize())
app.use(passport.session())
。使用('/',aRouter)
路由器.get
路由器.post
等:

//使用特定配置设置会话
应用程序使用(会话)({
秘密:“Bkuyqueajhbd”,
雷萨夫:是的,
saveUninitialized:true,
存储:新文件存储({path:'/tmp/session'})
}));
//把电线接上
app.use(passport.initialize())
app.use(passport.session())
编辑:关于
req.user
Passport用于在会话中存储用户ID

对服务器的每个请求都必须从数据库重新加载用户。 这是中间件
passport.initialize()
passport.session()
的工作

那里的逻辑将调用
passport.deserializeUser
以按ID查找用户-与通过
passport.serializeUser
登录会话时保存的ID相同

passport.serializeUser(函数(用户,完成){

done(null,user.id);//您的req.login()方法中有什么内容。请同时发布
req.login()
是一种通过passport自动附加的方法。请检查您的前端是否将凭据与请求一起发送。可能是向服务器发送的请求未与包含会话的cookies一起发送。请查看此信息以供参考。如果存在问题,请告知我我是否已说过两个请求共享相同的cookies请尝试替换req.login代码h这
req.logIn(user,(err)=>{if(err)return next(err);return next()});
你的req.logIn()方法里面有什么。请也发布
req.logIn()
是一种通过passport自动附加的方法。请检查您的前端是否将凭据与请求一起发送。可能是向服务器发送的请求未与包含会话的cookies一起发送。请查看此信息以供参考。如果存在问题,请告知我我是否已说过两个请求共享相同的cookies请尝试替换req.login代码这个
req.logIn(user,(err)=>{if(err)return next(err);return next()})
非常感谢您的回答,我将开始另一轮调试。一个问题:不再需要了吗?我认为
bodyParser.json()
express.json()好
IIRC,bodyParser在Express v2-3前后被删除,并在最新版本中重新添加到主软件包中。非常感谢!在调试
deserializeUser()
后,我发现了问题!出乎意料的是,原来我的
beforeach()
函数中的“其他无关内容”并不像我想象的那样无关(这是一个与时间一样古老的故事)。我每次都会删除测试数据库中的所有内容,以便测试是独立的,这显然会将用户从数据库中删除。idk我怎么没有注意到这一点!请享受您的投票、接受的答案和奖金100代表的帮助:)太棒了,很高兴听到@Lioness100!!非常感谢您的回答,我将开始另一轮调试。一个问题:不再需要了吗?我认为
bodyParser.json()
express.json()好
IIRC,bodyParser在Express v2-3前后被删除,并在最新版本中重新添加到主软件包中。非常感谢!在调试
deserializeUser()
后,我发现了问题!出乎意料的是,原来我的
beforeach()
函数中的“其他无关内容”并不像我想象的那样无关(这是一个和时间一样古老的故事)。我每次都在删除测试数据库中的所有内容,以便测试是独立的,这显然是从数据库中删除了用户。idk我怎么没有注意到这一点