邮递员-使用Collection pre-request脚本中定义的回调调用函数

时间:2018-11-23 10:59:16

标签: postman

我正在尝试定义一个函数,该函数在集合Pre-Request脚本中发送请求:

 const doRequest = (callback) => {
    const echoPostRequest = {
        url: 'https://postman-echo.com/post',
        method: 'POST',
        header: 'headername1:value1',
        body: {
            mode: 'raw',
            raw: JSON.stringify({ key: 'this is json' })
        }
    };
    console.log('ready to send request');
    pm.sendRequest(echoPostRequest, function (err, res) {
        console.log('request sent', err ? err : res.json());
        callback();
    });
}

glbl = {
    doRequest: doRequest
}

enter image description here

然后,在我的主要测试(对Google的简单GET)中,我将其保存在Pre-Request脚本中:

glbl.doRequest(() => console.log('works!'));

但是,永远不会调用回调,也永远不会打印“已发送请求”日志。
这是我的邮递员控制台的输出:

ready to send request 11:58:02.257
GET http://www.google.com 11:58:02.262

你知道我在做什么吗?
如果有帮助,我也可以提供导出的集合。

谢谢!

编辑:如果我将所有内容移至请求的Pre-request脚本中(而不是集合中),则一切正常

1 个答案:

答案 0 :(得分:0)

这里发生了一些事情。

本地范围问题

您的glbl变量缺少关键字varconstlet

缺少此关键字不会导致变量冒泡并独自成为全局变量。环境Pre-request脚本和请求pre-request脚本具有不同的作用域。

正如您所经历的那样,当您将脚本仅移至请求级别时,所有内容都位于同一范围内,因此可以正常工作。

创建全局功能

邮递员可以创建自己的全局变量。可以通过pm.globals.setpm.globals.get以编程方式完成。 https://www.getpostman.com/docs/v6/postman/environments_and_globals/variables#accessing-variables-through-scripts

这些变量有一些限制:您只能在其中存储字符串,因此,如果我们不做任何更改其类型的操作,则创建的对象和函数将不会保留。

在这种情况下,在设置任何变量之前,我们需要确保:

  • toString任何功能
  • JSON.stringify任何对象

现在,我们收藏的预请求脚本将如下所示:

const doRequest = (callback) => {
    const echoPostRequest = {
        url: 'https://postman-echo.com/post',
        method: 'POST',
        header: 'headername1:value1',
        body: {
            mode: 'raw',
            raw: JSON.stringify({ key: 'this is json' })
        }
    };
    console.log('ready to send request');
    pm.sendRequest(echoPostRequest, function (err, res) {
        console.log('request sent', err ? err : res.json());
        callback();
    });
};

const glbl = {
    doRequest: doRequest.toString()
};

pm.globals.set('glbl', JSON.stringify(glbl));

为了在请求级别使用它,我们也需要在此更新我们的预请求脚本:

const glbl = JSON.parse(pm.globals.get('glbl'));
const doRequest = eval(glbl.doRequest);

doRequest(() => console.log('works!'));