Postman 邮递员-无法在集合级预请求脚本中运行pm.sendRequest()

Postman 邮递员-无法在集合级预请求脚本中运行pm.sendRequest(),postman,postman-pre-request-script,Postman,Postman Pre Request Script,我正在使用newman在内置travis之后运行api测试 我试图限制预请求脚本的重复,因此查看了一些关于如何在集合级别使用预请求脚本的变通方法 我的问题是,我不想在每个请求上都运行它们,只想在需要它们的地方运行它们 示例:我正在尝试运行登录脚本以在私有端点上使用返回的令牌 我的代码如下所示: 收集级预请求脚本定义: Object.prototype.login = function() { const request = { url: 'somt

我正在使用newman在内置travis之后运行api测试

我试图限制预请求脚本的重复,因此查看了一些关于如何在集合级别使用预请求脚本的变通方法

我的问题是,我不想在每个请求上都运行它们,只想在需要它们的地方运行它们

示例:我正在尝试运行登录脚本以在私有端点上使用返回的令牌

我的代码如下所示:

收集级预请求脚本定义:

    Object.prototype.login = function() {
        const request = {
            url: 'somthing',
            method: 'GET',
            header: 'Content-Type:application/json',
            body: {
              mode: 'application/json',
              raw: JSON.stringify(
                {
                  email: pm.environment.get('someenv'),
                  password: pm.environment.get('someenv')
                })
            }
        };

        pm.sendRequest(request, function (err, res) {
            var response = res.json();
            pm.environment.set("token", response.token);
        });
    }
    _.login();
请求级别预请求脚本定义:

    Object.prototype.login = function() {
        const request = {
            url: 'somthing',
            method: 'GET',
            header: 'Content-Type:application/json',
            body: {
              mode: 'application/json',
              raw: JSON.stringify(
                {
                  email: pm.environment.get('someenv'),
                  password: pm.environment.get('someenv')
                })
            }
        };

        pm.sendRequest(request, function (err, res) {
            var response = res.json();
            pm.environment.set("token", response.token);
        });
    }
    _.login();
有人能帮我找出为什么我不能在此范围内运行pm.sendRequest吗

pm.environment.get('someenv')
非常有效,所以我不知道在这里该做什么

在不使用对象的情况下从集合级请求前脚本调用时,它运行良好,但是如果我只是将整个请求放在那里,它将在每个请求之前运行,这是我首先要避免的


我曾尝试使用console.log()注销一些内容,但pm.sendRequest()中的回调似乎从未运行过。

因此我找到了解决此问题的方法,我希望它能帮助将来的人:)

因此,很容易设置在每个请求之前运行的集合级预请求

但要对此进行一点优化,因为您不需要为集合中的每个请求运行每个脚本。您可以在此处使用我的解决方案。:)

我认为问题的原因是:

在不同作用域中使用的PM对象不会影响全局作用域中的PM对象,因此首先应该将全局PM对象作为函数调用的参数传递

收集级别请求应如下所示:

login = function (pm) {
    const request = {
        url: pm.environment.get('base_url') + '/login',
        method: 'POST',
        header: {
            'Content-Type':'application/json',
        },
        body: {
        mode: 'application/json',
        raw: JSON.stringify(
            {
                email:pm.environment.get('email'),
                password:pm.environment.get('passwd')
            })
        }
    };

    pm.sendRequest(request, (err, res) => {
        var response = res.json();
        pm.expect(err).to.be.a('null');
        pm.expect(response).to.have.property('token')
            .and.to.not.be.empty;
        pm.globals.set("token", response.token);
    });
};
对于要首先调用auth并使用令牌进行请求调用的确切请求:

login(pm);