How to set postman variable from node js

Hi,
I am using newman as library to run postman collections.
Looking to do a validation to compare expected json response saved in json file while the responses are recived using on(‘request’,(error,data) event.

below is my code where content is response from api and data is json response in file.

data.item.events.members[0].script.exec = ["pm.test(\"compare Response Static values\", function () {\r",
                //data.item.events.members[0].script.exec = ["pm.test(\"compare Response Static values\", function () {\r",
                "pm.globalVariables.set(\"actresponse\",JSON.parse(content));\r",
                "pm.globalVariables.set(\"expresponse\",JSON.parse(data));\r",
                "pm.expect(pm.globalVariables.get(actresponse)).to.be.eql(pm.globalVariables.get(expresponse));\r","});"]

but I see below error when I execute :
Cannot read properties of undefined (reading ‘set’) at assertion:0 in test-script.

questions : how can I pass node js variable to postman script?

Please help!

Hey @shalaka-m :wave:

Welcome to the Postman Community! :postman:

I’m really following what you’re trying to do here? What’s the Collection doing if you’re also trying to use the Newman events to make assertions against?

Might be just me - I’m just not really understanding the problem you’re trying to solve. :thinking:

Can you also share your full script, please?

Hi Danny,

Collection is hitting all the api’s and I am saving response in ‘actresponse’ variable.
Then I am comparing it with response saved in file and stored in variable ‘expresponse’.

below is my complete script.

const newman = require('newman'); // require newman in your project
//const fs = require('fs');
const fs = require('fs/promises');
const { request } = require('http');
//const { error } = require('console');
//const htmlextra = require('newman-reporter-htmlextra');

// call newman.run to pass `options` object and wait for callback
newman.run({
    collection: require('./Test.postman_collection.json'),
    environment: require('./FecthData-QA-115.postman_environment.json'),
    reporters: 'cli'
}, function(err) {
    if (err) {
        throw err;
    }
}).on('request',(error,data)=>{
    //console.log('Request name:' + data.item.name);
    //console.log(data.response.stream.toString());
    let reqName = data.item.name;
    fileName = reqName+'_response.json';
    const content = data.response.stream.toString();
    let expresponse;
    let actresponse = JSON.parse(content);

    /*fs.readFile(fileName,'utf8', (error, data)=> {
        if (error){
            console.log(error);
        }
        //console.log("inside readFile");
        //console.log(fileName);
        //console.log(data);
        expresponse = JSON.parse(data);
        //console.log(expresponse);
        //console.log(array[0].date);
        //data.events[0].script.exec = ["pm.collectionVariables.set(\"expectedResponse\",array);"];
        //console.log(pm.collectionVariables.get("expectedResponse"));
        let actresponse = JSON.parse(content);
        
    
    });*/
    fs.readFile(fileName)
    .then((data)=>{
        expresponse = JSON.parse(data);
    })
    .catch((error)=>{
        console.log(error);
    })

    data.item.events.members[0].script.exec = ["pm.test(\"compare Response Static values\", function () {\r",
                //data.item.events.members[0].script.exec = ["pm.test(\"compare Response Static values\", function () {\r",
                "pm.globalVariables.set(\"actresponse\",JSON.parse(content));\r",
                "pm.globalVariables.set(\"expresponse\",JSON.parse(data));\r",
                "pm.expect(pm.globalVariables.get(actresponse)).to.be.eql(pm.globalVariables.get(expresponse));\r","});"];

});

Hey @shalaka-m I spotted some issues which are likely the cause of errors you are seeing

The following code will run asynchronously, so it is not guaranteed that the value inside expresponse would be available when you are setting the script using data.item.events.members[0].script.exec

To fix this, move that statement inside then().

And while setting global variables, you are passing strings, so newman would not be aware of what the variables content and data

...
"pm.globalVariables.set(\"actresponse\",JSON.parse(content));\r", // Where is content in the scope of the test script?
"pm.globalVariables.set(\"expresponse\",JSON.parse(data));\r", // same with data?
...

Change that to:

   data.item.events.members[0].script.exec = ["\n pm.test(\"compare Response Static values\", function () {\n",
   "pm.globalVariables.set('actresponse', '" + JSON.stringify(actresponse) + "');\n",
   "pm.globalVariables.set('expresponse', '" + JSON.stringify(expresponse) + "');\n",
   "pm.expect(JSON.parse(pm.globalVariables.get('actresponse'))).to.be.eql(JSON.parse(pm.globalVariables.get('expresponse')));\n","});"];

I haven’t tested these, but the async file-read function may cause other problems too! The code may not return before the collection’s “test” script gets executed for example.

You may want to revisit how you are structuring the file read to get expected responses. A better approach would be to read the responses and store inside a variable before executing newman.run(), but it would come at the cost of memory overhead.

Thanks @xk0der ,
I see this error using above solution ‘TypeError: Cannot read properties of undefined (reading ‘events’)’ .
Looks like postman script is unable to read variables that are set in node.

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.