访问不存在的属性的安全方法

时间:2019-04-30 21:44:12

标签: javascript json

我正在将Google Apps脚本与JavaScript代码一起使用,并运行UrlFetchApp,以从Stripe API中提取数据以检索发票。然后,脚本将API中的数据更新为Google表格模板。

我遇到的问题是,如果API在特定行上没有针对客户的数据,则会破坏脚本。该API将缺少的数据存储为NULL,例如当客户在发票上没有折扣时使用"discount": null

当脚本未显示任何数据时,NULL响应将中断脚本并停止运行。我要做的是返回一个值,该值指定没有数据(例如:无折扣地返回数字0),并使脚本在其余代码行中运行。

我的代码:

function getInvoiceObj() 
  {
    var apiKey, content, options, response, secret, url;

    secret = "rk_live_xxxxxxxxxxxxxxxxxx";
    apiKey = "xxxxxxxxxxxxxxxxx";

    url = "https://api.stripe.com/v1/invoices/in_xxxxxxxxxxxxx?expand[]=charge&expand[]=customer";

    options = {
      "method" : "GET",
      "headers": {
        "Authorization": "Bearer " + secret 
      },
      "muteHttpExceptions":true
    };

    response = UrlFetchApp.fetch(url, options);

    //Push data to Sheet from invoice. **Writes over existing Sheet data**
    content = JSON.parse(response.getContentText());
    var sheet = SpreadsheetApp.getActiveSheet();

     /* Customer Discount */

sheet.getRange(21,2).setValue([content.discount.coupon.percent_off]);
}

2 个答案:

答案 0 :(得分:1)

您可能正在寻找if

if(content.discount===null)
  sheet.getRange(21,2).setValue([0]);
else
  sheet.getRange(21,2).setValue([content.discount.coupon.percent_off]);

也许?:

sheet.getRange(21,2).setValue([
  content.discount===null?0:content.discount.coupon.percent_off
]);

答案 1 :(得分:1)

这有点棘手,并且从现在开始已经使用多年了,您的问题是import React from "react"; import { Route, BrowserRouter as Router } from "react-router-dom"; import Home from "./Home"; import List from "./List"; import Hotel from "./Hotel"; import './styles/app.scss'; class App extends React.Component { render() { return ( <Router> <div className="app"> <Route path="/" component={Home} exact /> <Route path="/hotels/:selectedCountry/:datefrom?:dateto?" component={List} /> <Route path="/hotels/:selectedCountry/:selectedHotel:datefrom?:dateto?" component={Hotel} /> </div> </Router> ); } }; export default App; 中不存在coupon,因此无法从未定义的属性中获取任何值(因此脚本中断),有几种技术可以从不存在的对象访问属性,例如:

  • discount结构

    try...catch
  • 可选对象传递

    try {
        sheet.getRange(21,2).setValue([content.discount.coupon.percent_off]);
    } catch() {
        sheet.getRange(21,2).setValue([0]);
    }
    
  • 嵌套的存在

    const discountValue = ((content.discount || {}).coupon || {}).percent_off || 0;
    sheet.getRange(21,2).setValue([discountValue]);
    
  • 关于属性访问的一些抽象

    const discountValue = (content.discount && content.discount.coupon && content.discount.coupon.percent_off) || 0;
    sheet.getRange(21,2).setValue([discountValue]);
    

仍然,等待const getPropertySafe = (props, object) => props.reduce((xs, x) => (xs && xs[x]) ? xs[x] : null, object) const value = getPropertySafe(['discount', 'coupon', 'percent_off'], content) sheet.getRange(21,2).setValue([value || 0]); 很快

The Existential Operator