如何通过Postman预请求脚本发送多个顺序请求并解决变量未定义问题
问题原因
pm.sendRequest是异步执行方法,你的原代码发送session请求后不会等待接口返回,就会直接往下执行构造、发送customer signon请求的逻辑,此时LocalSessionId还未被赋值,因此会提示未定义。
解决方案1:回调嵌套(最小改动适配原有代码)
将customer signon的全部逻辑放到session请求的成功回调中,确保只有成功拿到会话ID后才会执行登录相关逻辑,同时修复了你原代码中JSON参数缺失括号的语法错误:
const sessionRequestData = { url: "http://myurl.com/session", method: 'POST', header: { 'content-type': 'application/json' }, body: { mode: 'raw', raw: JSON.stringify({ "device": { "id": "web", "type": "WEB" } }) } }; pm.sendRequest(sessionRequestData, function (err, res) { if (err) { console.log("mailman: error retrieving session id"+err); return; // 报错直接终止后续流程 } var jsonData = res.json(); console.log("mailman: retrieved session data succesfully"+ jsonData.session.id); // 注意:原代码日志打印jsonData.session.id,存变量用的是jsonData.security.session.id,路径不一致请根据接口实际返回调整 pm.variables.set("LocalSessionId", jsonData.security.session.id); // 登录请求逻辑移到session请求成功回调内部 const customerSignonRequestData = { url: "http://myurl.com/CustomerSignOn", method: 'POST', header: { 'content-type': 'application/json' }, body: { mode: 'raw', raw: JSON.stringify({ "customerRequest": { "identities": { "identity": [ { "data": "sessionId", "value": pm.variables.get("LocalSessionId") } ] } } }) } }; pm.sendRequest(customerSignonRequestData, function(err, res){ console.log("customer sign on request "+ JSON.stringify(customerSignonRequestData.body.raw)) if (err) { console.log("mailman: unable to signon"+err); return; } var jsonData = res.json(); console.log("mailman: login successful"+ JSON.stringify(jsonData)) }); });
解决方案2:Promise封装(多接口串行场景更易维护)
如果后续还要新增更多串行调用的接口,嵌套回调可读性会很差,可以把pm.sendRequest封装为Promise,用async/await写同步逻辑:
// 封装pm.sendRequest为Promise function sendRequest(req) { return new Promise((resolve, reject) => { pm.sendRequest(req, (err, res) => { if (err) return reject(err) resolve(res) }) }) } // 主逻辑用async/await串行执行 (async function() { // 1. 请求session const sessionReq = { url: "http://myurl.com/session", method: 'POST', header: { 'content-type': 'application/json' }, body: { mode: 'raw', raw: JSON.stringify({"device": {"id": "web","type": "WEB"}}) } } const sessionRes = await sendRequest(sessionReq) const sessionData = sessionRes.json() const sessionId = sessionData.security.session.id pm.variables.set("LocalSessionId", sessionId) // 2. 登录请求 const signonReq = { url: "http://myurl.com/CustomerSignOn", method: 'POST', header: { 'content-type': 'application/json' }, body: { mode: 'raw', raw: JSON.stringify({ "customerRequest": { "identities": { "identity": [{"data": "sessionId","value": sessionId}] } } }) } } const signonRes = await sendRequest(signonReq) console.log("mailman: login successful"+ JSON.stringify(signonRes.json())) })()
注意事项
请务必核对session接口的实际返回结构,确认sessionId的取值路径,避免因为路径错误导致取到空值。
内容的提问来源于stack exchange,提问作者Brooklyn99
相关产品推荐
相关产品推荐

