You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 07:36:00