Cypress从DB获取token传入API请求体时代码运行异常求助
问题原因
你的代码无法运行核心是三个Cypress基础机制问题:
- Cypress所有内置/自定义命令(包括
cy.task、cy.ResetPassAPI)都是异步排队执行的,直接用const resetoken = cy.task(...)的写法,拿到的不是数据库查询返回的实际token字符串,而是Cypress的链式调用对象,传入请求体必然不符合接口参数要求。 - SQL查询返回的是结果集数组,不是直接返回单个字段值,就算拿到了异步结果,不做结构解析也拿不到正确的token值。
- 额外时序风险:重置密码接口返回后,数据库写入token可能存在毫秒级延迟,直接查库有可能拿到上一次生成的旧token。
修复代码
直接替换成如下写法即可:
it.only('Change Password', () => { cy.ResetPassAPI(globalThis.data.dradminemail); // 可选:如果接口返回后DB写入有延迟,加短等待避免查到旧数据 cy.wait(300); cy.task( 'queryDb', `select _Token from tokens WHERE _Member_Id = 25372 and _Token_Type = "resetPassword" ORDER BY _id DESC LIMIT 1` ).then((dbRes) => { // 从查询结果集中解析出实际token值 const resetoken = dbRes[0]._Token; cy.request({ method: 'PATCH', url: 'https://xxx/xx/xx/changePasswordWithToken', body: { confirmPassword: 'xxx', password: 'xx', token: resetoken, uid: 1234, }, }); }); });
关键说明
- 所有依赖Cypress命令执行结果的逻辑,必须写在对应命令的
.then()回调中,Cypress会按队列顺序执行完前序操作后,把结果传入回调再执行后续逻辑,不要尝试用同步变量直接接收Cypress命令的返回值。 - 如果你的
cy.ResetPassAPI自定义命令没有等待接口响应完成就resolve,需要先给这个命令加等待逻辑,确保接口调用完成后再执行查库操作。 - 如果查库偶尔拿不到最新token,可以把固定等待换成Cypress重试逻辑,比如循环查询直到查到生成时间晚于重置接口调用时间的token,稳定性更高。
内容的提问来源于stack exchange,提问作者ruffainn
相关产品推荐
相关产品推荐

