Loop and if in node.js - SOLVED

Hi

So I trying to return Google Calendar events through a HTTP response via node.js - and it’s sort of working.

But
a) - it isn’t pretty and I don’t know how to make it a loop…
b) - sometimes Google Calender event list doesn’t return an item.start.date but an item.start.dateTime insted… So I need an if then to check for existing item.start.date…

I know some php and some C++, but I’m falling short as to how I can do this here…

// To return a custom HTTP response, use $.respond() [requires HTTP trigger]
export default defineComponent({
  async run({ steps, $ }) {
    await $.respond({
      status: 200,
      headers: {},
      body:
      steps.google_calendar_list_events.$return_value.items[0].start.date.substr(8,2) + "/" +
      steps.google_calendar_list_events.$return_value.items[0].start.date.substr(5,2) + " " +
      steps.google_calendar_list_events.$return_value.items[0].summary + ";" +

      steps.google_calendar_list_events.$return_value.items[1].start.date.substr(8,2) + "/" +
      steps.google_calendar_list_events.$return_value.items[1].start.date.substr(5,2) + " " +
      steps.google_calendar_list_events.$return_value.items[1].summary + ";" +

      steps.google_calendar_list_events.$return_value.items[2].start.date.substr(8,2) + "/" +
      steps.google_calendar_list_events.$return_value.items[2].start.date.substr(5,2) + " " +
      steps.google_calendar_list_events.$return_value.items[2].summary + ";" +

      steps.google_calendar_list_events.$return_value.items[3].start.date.substr(8,2) + "/" +
      steps.google_calendar_list_events.$return_value.items[3].start.date.substr(5,2) + " " +
      steps.google_calendar_list_events.$return_value.items[3].summary + ";" +

      steps.google_calendar_list_events.$return_value.items[4].start.date.substr(8,2) + "/" +
      steps.google_calendar_list_events.$return_value.items[4].start.date.substr(5,2) + " " +
      steps.google_calendar_list_events.$return_value.items[4].summary + ";" +

      steps.google_calendar_list_events.$return_value.items[5].start.date.substr(8,2) + "/" +
      steps.google_calendar_list_events.$return_value.items[5].start.date.substr(5,2) + " " +
      steps.google_calendar_list_events.$return_value.items[5].summary + ";" +

      steps.google_calendar_list_events.$return_value.items[6].start.date.substr(8,2) + "/" +
      steps.google_calendar_list_events.$return_value.items[6].start.date.substr(5,2) + " " +
      steps.google_calendar_list_events.$return_value.items[6].summary + ";" +

      steps.google_calendar_list_events.$return_value.items[7].start.date.substr(8,2) + "/" +
      steps.google_calendar_list_events.$return_value.items[7].start.date.substr(5,2) + " " +
      steps.google_calendar_list_events.$return_value.items[7].summary + ";" +

      steps.google_calendar_list_events.$return_value.items[8].start.date.substr(8,2) + "/" +
      steps.google_calendar_list_events.$return_value.items[8].start.date.substr(5,2) + " " +
      steps.google_calendar_list_events.$return_value.items[8].summary + ";" +

      steps.google_calendar_list_events.$return_value.items[9].start.date.substr(8,2) + "/" +
      steps.google_calendar_list_events.$return_value.items[9].start.date.substr(5,2) + " " +
      steps.google_calendar_list_events.$return_value.items[9].summary + ";"                              
      ,
    })
  },
})

I hope someone is up for helping me…

Hi @engberg

First off, welcome to the Pipedream community. Happy to have you!

I too came from a PHP background before getting into JS & Node.js. I recommend reading Eloquent Javascript, it’s free to read online and it’s very comprehensive to get started.

That should help with the looping question.

As for property checking, in JS there’s a special safe checking operator (?.) that lets you safely check nested objects for the existence of a property. It’s very handy for this exact scenario.

1 Like

Thanks for the links - I appriciate them.

Though I’m somewhat confused as to where I might write the code - it doesn’t seem to let me write code inside the “body :” statement.

The loop might be something like:

let result = "";

for (let i = 0; i < 10; i++) {
  result += steps.google_calendar_list_events.$return_value.items[i].start.date.substr(8,2) + "/" + steps.google_calendar_list_events.$return_value.items[i].start.date.substr(5,2) + " " 
  + steps.google_calendar_list_events.$return_value.items[i].summary + ";";
}

result;

The check might be something like

if (steps.google_calendar_list_events.$return_value.items[i].start.date == null) {
      result += steps.google_calendar_list_events.$return_value.items[i].start.dateTime;
    } else {
      result += steps.google_calendar_list_events.$return_value.items[i].start.date;
    }

Please take a look at the Working with objects guide in the MDN docs:

If you’re familiar with array_map in PHP, you can also map over arrays in JS:

// To return a custom HTTP response, use $.respond() [requires HTTP trigger]
export default defineComponent({
  async run({ steps, $ }) {
    await $.respond({
      status: 200,
      headers: {},
      body: steps.google_calendar_list_events.$return_value.items.map((event) => { 
           // transform the data on a per item basis here
           if(event?.start?.date) {
               return event.start.date
           } else {
               return event?.start?.dateTime
           }
      })
    })
})

Please note, this is untested code and purely for an example. I recommend reading Eloquent Javascript and other JS guides for understanding the available object transformations and syntax.

1 Like

Alright - took your code and modified it just a bit - now it works to my liking - sure it could be shorter and sweeter :wink:

// To return a custom HTTP response, use $.respond() [requires HTTP trigger]
export default defineComponent({
  async run({ steps, $ }) {
    await $.respond({
      status: 200,
      headers: {},
          body: steps.google_calendar_list_events.$return_value.items.map((event) => { 
           // transform the data on a per item basis here
           if(event?.start?.date) {
               return event.start.date.substr(8,2) + "/"  + event.start.date.substr(5,2) + " " + event.summary + ";"
           } else {
               return event?.start?.dateTime.substr(8,2) + "/"  + event?.start?.dateTime.substr(5,2) + " " + event.summary + ";"
           }
          }),
    })
  },
})

Thanks a lot for helping…