Не удается определить проблему с функцией JS storeClient и выданную ошибку - PullRequest
0 голосов
/ 24 декабря 2018

Я создал две асинхронные функции в своем шаге JavaScript Zapier для анализа необработанного веб-крюка.Две асинхронные функции сосредоточены вокруг storeClient для «получения» и «установки» значений в Storage by Zapier.Тем не менее, я получаю сообщение об ошибке.У меня есть скриншот из подэтапа теста Zapier.Из-за способа, которым Zapier возвращается при ошибке, я не вижу ничего из моего файла console.log.

Что я сделал не так с асинхронными функциями?

    // function to talk to Storage By Zapier to get a key
    //
    async function getStore(passKey) {
        try {
            const store = StoreClient(inputData.secret);
            const data = await store.get(passKey);
            console.log(`Here is the data from store: ${data}`);
            return data;
         } catch(error) {
            console.log(`We hit an error: ${error}`);
         }
     }

     // function to talk to Storage By Zapier to set a key and values
     //
     async function setStore(passKey, passTags) {
         try {
             const store = StoreClient(inputData.secret);
             await store.setMany({'email': passKey, 'tags': passTags});
         } catch(error) {
             console.log(`We hit an error: ${error}`);
         }
     }

     // for testing in editor
     //
     //var contactData = JSON.parse(raw);
     // only when Storage By Zapier not available 
     //var inputData  = JSON.parse(inputStore);

     // pull in data from Zapier
     //
     var contactData = JSON.parse(inputData.raw);
     //console.log(contactData);
     //console.log(inputData.secret);
     //var inputData = JSON.parse(inputData.testStore);
     //console.log(inputData.tags);
     //console.log(`inputData.tags: ${inputData.tags}`);

     //
     //  create output object to pass back to zapier after processing webhook from AgileCRM
     //
     //  receive raw webhook by parsing using built-in function
     //
     var output = new Object();

     //console.log(`inputData.tags: ${inputData.tags}`);

     var contactEventData, isValentus, isDoubleOptIn, isUpdate, contactTags, tagsDidntchange, storeTags, storeTagsArray, tagsEqualCount;

     // set-up variables and init
     //
     isValentus       = false;
     isDoubleOptIn    = false;
     tagsDidntchange  = false;
     contactTags      = new Array();
     storeTagsArray   = new Array();
     tagsEqualCount   = 0;
     contactEventData = contactData.eventData;

     //  find out is this is an update to a contact
     //
     contactData.eventName === 'Contact is Updated' ? isUpdate = true : isUpdate = false;

     //  find out if the contact is:
     //      Valentus, Double Opt-in and save other tags
     //
     contactEventData.tags.forEach(function(contactTag) {
         switch(contactTag) {
             case 'Valentus':
                 isValentus = true;
                 break;
             case 'Double_Opt_In':
                 isDoubleOptIn = true;
                 break;
             default:
                 contactTags.push(contactTag);
         }
     })

     //  initialize all variables to be passed via output object to Zapier
     //     ---this is so that the subsequent steps in the zap have data for the variable
     //
     var contactEmailAddress = '-', contactFirstName ='-', contactLastName = '-', contactPhoneNumber = '-', contactSource = '-', contactValentusUSERID = '-', contactStatus = '-', contactPhoneCallType = '-', contactInvitedby = '-', contactInvitedByEmail = '-', contactInvitedByWebsiteUID = '-', contactInvitedByValentusUSERID = '-', contactValentusTeam = '-';

     //  process contact properties to get needed variable data by property name
     //
     contactEventData.properties.forEach(function(properties) {
         let propertyName  = properties.name;
         let propertyValue = properties.value;
         switch(propertyName) {
             case 'email':
                 contactEmailAddress = propertyValue;
                 break;
             case 'first_name':
                 contactFirstName = propertyValue;
                 break;
             case 'last_name':
                 contactLastName = propertyValue;
                 break;
             case 'phone':
                 contactPhoneNumber = propertyValue;
                 break;
             case 'Source':
                 contactSource = propertyValue;
                 break;
             case 'Valentus userid': 
                 contactValentusUSERID = propertyValue;
                 break;
             case 'Status':
                 contactStatus = propertyValue;
                 break;
             case 'Phone call type':
                 contactPhoneCallType = propertyValue;
                 break;
             case 'Invited by':
                 contactInvitedby = propertyValue;
                 break;
             case 'Invited by email':
                 contactInvitedByEmail = propertyValue;
                 break;
             case 'Invited by website UID':
                 contactInvitedByWebsiteUID = propertyValue;
                 break;
             case 'Invited by Valentus userid':
                 contactInvitedByValentusUSERID = propertyValue;
                 break;
             case 'company':
                 contactValentusTeam = propertyValue;
                 break;
         }
     })

     //  get storage by email address and compare tags
     //  and see if tags changed.  if they changed, we don't
     //  want to process any further
     //
     //storeTags = inputData.tags;

     getStore(contactEmailAddress).then(data => {
         console.log(data);
         storeTags = data;
     });
     //console.log(`storeTags returned is: ${storeTags}`);

     //  Transform store string into array of tags to compare 
     //  with hook tags array
     //
     storeTagsArray = storeTags.split(',');

     //  compare storeTags to contactTags
     //    --note both arrays may not be in same order
     //
     contactTags.forEach(function(contactTag) {
         storeTagsArray.forEach(function(storeTag) {
             if (storeTag === contactTag) {
                 tagsEqualCount++;
             }
         })
     })

     if (tagsEqualCount === storeTagsArray.length && tagsEqualCount === contactTags.length) {
         tagsDidntchange = true;
     } else {
         setStore(contactEmailAddress, contactTags);
     }

     //  now place contact property variables into output object to pass
     //
     output = {
         'isValentus': isValentus,
         'isUpdate': isUpdate,
         'isDoubleOptIn': isDoubleOptIn,
         'tagsDidntchange': tagsDidntchange,
         'contactEmailAddress': contactEmailAddress, 
         'contactFirstName': contactFirstName, 
         'contactLastName': contactLastName, 
         'contactPhoneNumber': contactPhoneNumber, 
         'contactSource': contactSource, 
         'contactValentusUSERID': contactValentusUSERID, 
         'contactStatus': contactStatus, 
         'contactPhoneCallType': contactPhoneCallType, 
         'contactInvitedby': contactInvitedby, 
         'contactInvitedByEmail': contactInvitedByEmail, 
         'contactInvitedByWebsiteUID': contactInvitedByWebsiteUID, 
         'contactInvitedByValentusUSERID': contactInvitedByValentusUSERID, 
         'contactValentusTeam': contactValentusTeam,
         'contactTags': contactTags
     };

     /*  for debug */
     console.log(output);
     /**/

снимок экрана с ошибкой

1 Ответ

0 голосов
/ 17 января 2019

Дэвид здесь, из команды Zapier Platform.

Корень вашей проблемы находится в следующей строке:

 storeTagsArray = storeTags.split(',');

Если storeTagsArray равно undefined, то при вызове .split() на нем происходит сбой.

Причина, по которой он не определен, заключается в том, как вы обрабатываете асинхронный код выше.А именно, это прямо выше:

getStore(contactEmailAddress).then(data => { // line 1
     console.log(data);                      // line 2
     storeTags = data;                       // line 3
 });

storeTagsArray = storeTags.split(',');       // line 4

Вы правильно используете .then после обещания, но код за пределами then продолжает работать.Вышеуказанный порядок выполнения - строка 1, 4, (в конечном итоге) 2, 3. Поскольку 4 выполняется до инициализации storeTagsArray, он все равно undefined.

Решение здесь простое - используйте await:

storeTags = await getStore(contactEmailAddress)
storeTagsArray = storeTags.split(',');      

Мы упаковываем весь ваш код в большую async функцию, чтобы вы могли ожидать ее там, где вам это нужно.Здесь немного больше информации здесь .

У вас есть еще один .then, который вам нужно исправить подобным образом, и тогда ваш код должен работать сверху вниз,как и ожидалось!

...