Node.js Cookie在supertest/superagent测试中持续存在,但用户不';不要一直登录 我的目标
我试图在每次测试之前使用supertest的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
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我怎么没有注意到这一点