最常见原因是响应结构与提取路径不匹配或响应非JSON。需先用console.log(pm.response.text())查看原始响应,再据此选择pm.response.json()或正则提取,并始终判空处理。

为什么 pm.response.json() 提取字段返回 undefined
最常见原因是响应结构和你写的路径不匹配。比如你以为返回的是 {"data":{"id":123}},实际是 {"result":{"id":123}} 或者根本没 data 层;也可能是响应不是 JSON(比如 302 重定向、空响应、HTML 错误页),pm.response.json() 就会直接抛错或返回空对象,后续取值自然 undefined。
验证方法很简单:在 Tests 里加一行 console.log(pm.response.text()),点 Send 后打开 Postman 控制台(View → Show Postman Console),先看原始响应长什么样,再决定怎么写提取逻辑。
- 响应是纯文本或 HTML?别用
pm.response.json(),改用pm.response.text()+ 正则提取 - 响应有嵌套但层级深?用
console.log(pm.response.json())看完整结构,注意 key 名大小写(userId≠user_id) - 响应里有数组?比如
{"list":[{"name":"a"}]},要取第一个 name 得写json.list[0].name,不是json.list.name
用正则提取时 match() 返回 null 怎么办
match() 一匹配不上就返回 null,接着调 [1] 就报 Cannot read property '1' of null —— 这是脚本崩掉的典型信号,不是字段真不存在。
安全写法必须加判空。比如从 HTML 响应里提 execution 字段:
Postman 12.27.7 Windows x64 官方安装包,适用于 API 设计、调试、测试与协作。该系列包含 Enterprise 云端性能测试静态 IP 出口能力,以及接口规范标签管理改进,适合受限网络测试与规范资源组织场景。
const html = pm.response.text();
const match = html.match(/name="execution" value="(.*?)"/);
if (match && match[1]) {
pm.environment.set("execution", match[1]);
} else {
console.warn("未找到 execution 字段,请检查响应是否为登录页HTML");
}
- 永远不要直接链式调用
match()[1],先存变量再判断 - 正则里的
.*?是非贪婪匹配,比.*更安全,避免跨标签误抓 - 如果响应含换行,
.默认不匹配换行符,得加s标志:/pattern/s
pm.environment.set() 设了但下个请求还是取不到
环境变量设了却读不出来,90% 是变量作用域或设置时机问题。Postman 的变量分三层:全局(pm.globals)、环境(pm.environment)、局部(pm.variables),{{xxx}} 默认只读环境变量。
- 确认你在
Tests(不是Pre-request Script)里设的 ——Tests在响应回来后执行,才是取值的正确时机 - 确认当前请求已选中对应环境(右上角眼睛图标旁显示的环境名是否匹配)
- 设的是
pm.globals.set(),但下个请求用{{xxx}}引用?不行,得改成{{globals.xxx}}或统一用环境变量 - 控制台输
pm.environment.get("xxx")看返回值,如果是undefined,说明没设成功或设到了别的作用域
响应结构动态变化导致路径失效
有些接口在失败时返回扁平结构 {"code":401,"msg":"未登录"},成功时才返回嵌套数据 {"code":0,"data":{"token":"xxx"}}。如果你固定写 json.data.token,失败时 json.data 就是 undefined,整条链路崩。
稳妥做法是分情况处理:
const json = pm.response.json();
if (json.code === 0 && json.data) {
pm.environment.set("token", json.data.token);
} else {
console.error("接口异常,code:", json.code, "msg:", json.msg);
throw new Error("登录失败,无法提取 token");
}
- 别假设响应永远成功,加状态码或关键字段判空是基本操作
- 电商、支付类接口尤其爱这么干:成功走 data,失败走 error 字段,结构完全两套
- 如果连
code字段都可能不存在(比如服务端直接返回 500 HTML),那就得先try/catchpm.response.json()
真正卡住人的,往往不是语法不会写,而是没意识到“响应内容本身就不稳定”。调试时盯着 JS 报错看,不如先盯三秒控制台里 pm.response.text() 的原始输出——那才是唯一可信的事实。










