集合级Pre-request Script在每个请求前执行一次,用于统一注入Header、生成时间戳等;需避免在其中直接使用未完成的异步token获取逻辑,推荐用文件夹隔离或手动预存token。

集合级 Pre-request Script 怎么加
直接在集合上配置预请求脚本,是解决「所有请求共用逻辑」最干净的方式。比如统一注入 Authorization 头、生成时间戳、刷新 token,都不用每个请求重复写。
操作路径很明确:在侧边栏右键目标集合 → 点击 “Edit” → 切到 Pre-request Script 标签页 → 粘贴 JavaScript 代码 → 点 Save。
注意:这个脚本会在集合里**每个请求发送前执行一次**,不是只运行一次。如果集合有 10 个请求,它就执行 10 次。
- 脚本里不能访问
pm.response(因为响应还没回来) - 可以用
pm.variables.set()设置变量,后续请求通过{{variable_name}}引用 - 若需调用登录接口获取 token,必须用
pm.sendRequest(),且需配合回调处理,不能用await(Postman 的 JS 运行环境不支持顶层 await)
为什么 pm.sendRequest 在集合预请求里常失败
很多人照着示例写 pm.sendRequest() 获取 token,结果控制台报 err is not null 或变量没设上——根本原因是没处理异步时序。
集合级预请求脚本本身是同步执行的,但 pm.sendRequest() 是异步的。如果你写了:
pm.sendRequest(loginReq, (err, res) => { pm.variables.set('token', res.json().token) });
pm.request.headers.add({key: 'Authorization', value: 'Bearer {{token}}'}); // 这行立刻执行,{{token}} 还没被设上!
结果就是 header 里塞了个字面量 Bearer {{token}},而不是真实值。
正确做法只有两种:
- 把依赖 token 的请求放进一个**文件夹**,给该文件夹单独配预请求脚本(确保 token 已就绪后再发业务请求)
- 或改用「先手动跑一次登录请求 → 把 token 存成环境变量 → 其他请求直接引用」,避开异步陷阱
时间戳、随机数这类简单动态值怎么安全生成
不需要调接口、不涉及异步,就纯本地计算,这是预请求脚本最稳的用法。
Postman Mac版是一款专为macOS设计的API开发与测试工具,凭借简洁的界面和强大的功能,深受开发者喜爱。它支持发送各种HTTP请求(GET、POST、PUT等),轻松管理接口集合、环境变量和模拟服务器。Mac用户可享受原生性能、快捷键优化及与系统无缝集成的体验,适用于接口调试、自动化测试和文档生成。无论是个人项目还是团队协作,Postman for Mac都能提升API开发效率,是ma
常见错误是直接用 new Date().getTime() 赋值,但忘了格式化或时区问题。比如后端要求秒级时间戳,你给了毫秒级,就直接 400。
推荐写法:
// 秒级时间戳(常用)
pm.variables.set('ts', Math.floor(Date.now() / 1000));
// ISO 8601 格式(带时区,适合日志或调试)
pm.variables.set('iso_time', new Date().toISOString());
// 8 位随机数(字符串,避免前置零被转成数字)
pm.variables.set('nonce', Math.random().toString(36).substr(2, 8));
然后在请求 URL、Header 或 Body 里直接写 {{ts}}、{{nonce}} 即可。这些值每次请求都会刷新,无需额外控制。
脚本执行顺序和变量作用域容易混淆的点
Postman 的变量查找顺序是:request-level → folder-level → collection-level → environment → globals。但脚本执行顺序是另一回事。
关键事实:
- 集合级预请求脚本,在**每个请求开始前**都执行(不是只执行一次)
- 如果集合里有文件夹,且文件夹也配了预请求脚本,那执行顺序是:
collection pre-request→folder pre-request→request pre-request -
pm.variables.set()在任意层级脚本里设的变量,对当前请求及之后的请求都可见;但pm.environment.set()设的是环境变量,会持久化到当前选中的环境里
最容易忽略的是:你在集合脚本里用 pm.variables.set('x', 'a'),又在某个请求的脚本里用 pm.variables.set('x', 'b'),那么这个请求看到的 x 是 b,但下一个请求又会回到 a(因为集合脚本重设了一次)。变量不是“覆盖”,而是“每次重置”。









