Accessing query values in HTTP POST Third Party Service


I’m confused by the way two HTTP services are behaving differently.

The first service is based on the tutorial at and has a hook based on

exports = async function(payload) {
   console.log('here is payload query object ' + JSON.stringify(payload.query));
   const mongodb ="mongodb-atlas");
   const eventsdb = mongodb.db(“my”db);
   const eventscoll = eventsdb.collection(“my collection");
//create values for the payload items sent to the endpoint
    const user = payload.query.user;
    const userName = payload.query.userName;
    const year = payload.query.year.substr(0, 4);
    const player = payload.query.player;
    const manufacturer = payload.query.manufacturer;
    const brand = payload.query.brand;
    const series = payload.query.series;
    const grader = payload.query.grader;
    const graded_id = Number(payload.query.graded_id);
    const career_stage = payload.query.career_stage;
    const team =;
    const card_number = Number(payload.query.card_number);
    const print_run = Number(payload.query.print_run);
    const number = Number(payload.query.number);
    const image_path = payload.query.image_path;
    const forTrade = payload.query.forTrade;
    const status = payload.query.status;
    const purchase_date = payload.query.purchase_date;
    const card_id = payload.query.card_id;
const result= await eventscoll.updateOne({ card_id: card_id },
{ $set: { 
  year: year,
  brand : brand,
  series : series,
  grader : grader,
  graded_id : graded_id,
  career_stage : career_stage,
  team : team,
  card_number : card_number,
  print_run : print_run,
  number : number,
  image_path : image_path,
  status : status,
  purchase_date : purchase_date
{ upsert: true }
  console.log('here is payload object ' + JSON.stringify(payload.query));

  if(result) {
     console.log('here is result ' + JSON.stringify(result));
     //return JSON.stringify(id,false,false);   
   return { text: `Error saving` };

From Google App Script I POST to this via

var options = {
  method: "post",
  payload: formData, //a JSON representation of the cells in the Google Sheet
if (player) {
  var insertID = UrlFetchApp.fetch(

This all works fine from Google Sheets. However I want to make POST request to the same endpoint via Axios or POSTMAN but I get an error
‘“error”: “{“message”:“Cannot access member ‘substr’ of undefined”}”,
“error_code”: “FunctionExecutionError”,

I’ve created another test POST endpoint with the code

exports = async function (payload, response) {
//console.log("payload.query "+ JSON.stringify(payload.query));

   const query = EJSON.parse(payload.body.text())
   console.log("payload.query "+ JSON.stringify(query));

    const results = await
        .db(“my db)
        .collection("my collection")
        .insertOne( query )

    response.setBody(results ? JSON.stringify(results) : "{}");

I can send the same JSON object to this endpoint and it is submitted to the collection fine. I’m confused about why in this second function I am not able to access any properties of payload.query (e.g. payload.query.career_stage from the first example) but instead have to access the query values via
const query = EJSON.parse(payload.body.text()).

Also, can anyone suggest how I could amend this service to accept an array of objects, so that where the document IDs match the document is updated, and where there is no match a new document is created? Sorry if this last question should be a separate question :slight_smile: