2017-09-02 26 views
0

我的應用程序發送提交表單數據到這個服務器端函數拋出:失敗處理器接收對象從不同是什麼在服務器端

function processFormData(data) 
{ 
    data = JSON.parse(data); 
    // validate data 
    var errorObject = {}, 
     potholeErrors = createErrorObjectFor('pothole'), 
     intervalSizeErrors = createErrorObjectFor('intervalSize'); 
    // make sure numbers are actual numbers and not NaN's. 
    if (!validateNumber(data.potholeWidth)) 
    { 
    potholeErrors.messages.push(errorTypes.NOT_A_NUMBER); 
    errorObject.potholeWidth = potholeErrors; 
    } 
    if (!validateNumber(data.intervalSize)) 
    { 
    intervalSizeErrors.messages.push(errorTypes.NOT_A_NUMBER); 
    errorObject.intervalSize = intervalSizeErrors; 
    } 
    // make sure numbers are within their respective bounds (handled by handleErrors()) 
    errorObject = handleErrors(data, errorObject); 
    // if intervalSize doesn't divide potholeWidth, make it so 
    if (data.potholeWidth % data.intervalSize > 0) data.potholeWidth = nextMultiple(data.intervalSize, data.potholeWidth); 
    // if there is anything in errorObject, throw it 
    if (Object.getOwnPropertyNames(errorObject).length != 0) 
    { 
    Logger.log('errorObject == ' + JSON.stringify(errorObject, null, '\t')); 
    throw errorObject; 
    } 
    // createSpreadsheet 
    return createSpreadsheet(data.spreadsheet, data.potholeWidth, data.intervalSize); 
} 

,其在成功,不正是它應該做。但是,當最終用戶輸入任何無效輸入時,服務器端返回的對象與最終獲得的對象不同。我試着輸入一個太小的坑洞寬度。當我檢查記錄儀在服務器端,我看到了這個正確的輸出:

what the client side SHOULD be getting....

然而,在開發者控制檯,我看到:

what the client side ACTUALLY gets....

傳達數據的代碼服務器看起來像:

function updateURL(url) 
    { 
     // activate button 
     $('#input[type="submit"]').prop('disabled', ''); 
     // change href of #spreadsheetLink 
     $('#spreadsheetLink').attr('href', url); 
     // unhide the link's container if hidden 
     if ($('#spreadsheetLink').parent().hasClass('hidden')) $('#spreadsheetLink').parent().removeClass('hidden'); 
     // hide the 'Loading...' element 
     if (!$('#loading').hasClass('hidden')) $('#loading').addClass('hidden'); 
    } 

    function emailLink() 
    { 
     google.script.run.withSuccessHandler(function() { 
      $('#emailLink').next().text('E-mail message has been sent!'); 
      $('#emailLink').prop('disabled', 'disabled'); 
     }).emailLink($('#spreadsheetLink').attr('href')); 
    } 

    function handleFails(failData) 
    { 
     var DEBUG = true; 
     if (DEBUG) console.log('failData == ' + JSON.stringify(failData, null, '\t')); 
     // hide 'Loading...' element 
     if (!$('#loading').hasClass('hidden')) $('#loading').addClass('hidden'); 
     // for now, let's ignore any Errors/TypeErrors. 
     if ((!failData instanceof Error) && (!failData instanceof TypeError)) 
     { 
      // for now, if there were any errors with any of the fields, simply mark them as .invalid 
      if ((failData.potholeWidth) && (failData.potholeWidth.messages.length > 0)) 
      { 
       if (!$('#potholeWidth').hasClass('invalid')) $('#potholeWidth').addClass('invalid'); 
      } 
      if ((failData.intervalSize) && (failData.intervalSize.messages.length > 0)) 
      { 
       if (!$('#intervalSize').hasClass('invalid')) $('#intervalSize').addClass('invalid'); 
      } 
     } 
    } 

    function submitFormData() 
    { 
     // hide spreadsheetLink container if not already done, and clear its <span> element if not already clear 
     var spreadsheetLinkContainer = $('#spreadsheetLink').parent(), 
      spanElement = $('spreadsheetLinkContainer').find('span'); 
     if (!$(spreadsheetLinkContainer).hasClass('hidden')) $(spreadsheetLinkContainer).addClass('hidden'); 
     if ($(spanElement).text() != '') $(spanElement).text(''); 
     // get all data 
     var potholeWidth = parseNumberField('potholeWidth'), 
      intervalSize = parseNumberField('intervalSize') || defaults.get('intervalSize'), 
      concaveEdges = $('input[name="concaveEdges"]').filter(function() { return $(this).prop('checked'); }).next().text() === 'Yes', 
      spreadsheetName = parseField('spreadsheetName') || defaults.get('spreadsheetName'); 
     // make button inactive 
     if (($(this).prop('tagName')) && ($(this).prop('tagName').toLowerCase() == 'input')) $(this).prop('disabled', 'disabled'); 
     // show "Loading..." element 
     if ($('#loading').hasClass('hidden')) $('#loading').removeClass('hidden'); 
     // submit this data to the server 
     google.script.run.withSuccessHandler(updateURL).withFailureHandler(handleFails).processFormData(JSON.stringify({ 
      potholeWidth: potholeWidth, 
      intervalSize: intervalSize, 
      concaveEdges: concaveEdges, 
      spreadsheet : spreadsheetName 
     })); 
    } 

和HTML看起來像這樣:

<form> 
     Place straightedge/yardstick along width of pothole such that it points at the corners, <a class="showImage">like this</a> 
     <span class="row"> 
      <label class="firstColumn seventeenTwentieths">Pothole width (in inches): </label> 
      <input type="text" class="secondColumn tenth numberField" id="potholeWidth" required /> 
     </span> 
     <span class="rowTight"> 
      <label class="firstColumn seventeenTwentieths">Interval size (in inches, default 1 inch): </label> 
      <input type="text" class="secondColumn tenth numberField" id="intervalSize" value="1" /> 
     </span> 
     <div class="rowTight"> 
      <label class="firstColumn">Do any of the edges intersect the straightedge/yardstick other than at the corners?</label> 
      <div class="secondColumn"> 
      <span> 
       <input type="radio" name="concaveEdges" id="yesConcaveEdges" /> 
       <label for="yesConcaveEdges">Yes</label> 
      </span> 
      <br> 
      <span> 
       <input type="radio" name="concaveEdges" id="noConcaveEdges" checked /> 
       <label for="noConcaveEdges">No</label> 
      </span> 
      </div> 
     </div> 
     <span class="rowTight"> 
      <label class="firstColumn half">Spreadsheet name: </label> 
      <input type="text" class="secondColumn nineTwentieths" id="spreadsheetName"/> 
     </span> 
     <span class="center row"> 
      <button class="center" id="clearForm">Clear</button> 
      <input type="submit" class="center action" value="Create spreadsheet" /> 
     </span> 
     </form> 
     <span id="loading" class="row center fullWidth hidden"> 
     Loading... 
     </span> 
     <span class="row center fullWidth hidden"> 
     <a href="#" id="spreadsheetLink">Here is your spreadsheet</a> 
     <button id="emailLink">E-mail me the link</button> 
     <span></span> 
     </span> 

客戶端實際獲取的對象是什麼以及如何確保它獲取服務器實際拋出的對象?

+0

要將數據發送到服務器,我使用了'JSON.stringify()'。我懷疑我不得不用它來從服務器拋出錯誤。 –

回答

0

我修正了它。

我做什麼

在code.gs

,而不是簡單throw errorObject;,我說throw JSON.stringify(errorObject);

在JavaScript.html文件

handleFails(),我轉換字符串服務器端扔ba ck進入對象(failData = JSON.parse(failData))以使用它。它輸出正確,一切都很好。

我所學到的

任何時間服務器是提供或接收數據,它MUST在一個字符串的形式! (使用JSON.stringify()使該數據成爲一個字符串!)

相關問題