2017-06-29 15 views
0

私はMeteorアプリケーションに関数を作成しました。これは、流星コレクションに含まれるデータを '豊かにする'ように設定されています。この機能は、コレクション内で反復処理を行い、fullcontact APIを使用して、db内で管理されているすべてのクライアントエントリ(LinkedIn Bio、従業員数など)に関する追加データを取得します。Meteor.methodの '未定義'プロパティを扱う

問題は、コレクション内のすべての要素ですべてのデータポイントを使用できるわけではないことにあります(クライアントにはLinkedInプロファイルがないなど)。この関数は要素の最初のカップルで機能しますが、を投げても失敗します。data variableには、この特定の例ではLinkedInプロファイルbioが含まれていないためです。

あなたはトレーニングとして何をお勧めしますか?何か案は?あなたの助けは大いに感謝されるでしょう - 私は数時間の間これにいました。

Meteor.methods({ 
    enrichment() { 
    var fullcontact = new FullContact(Meteor.settings.fullContact); 
    for (var i = 1; i < customerDb.find({ company: "Qualify" }).count(); i++) { 
     var url = customerDb.findOne({ company: "Qualify", 'item.clientId': i.toString() })['item']['contact_website']; 
     var data = fullcontact.company.domain(url); 
     if (data['status'] == 200) { 
     customerDb.update ({ 
      company: "Qualify", 'item.clientId': i.toString() 
     }, { 
      $push: { 
      bio: data['socialProfiles'][2]['bio'], 
      keywords: data['organization']['keywords'], 
      employees: data['organization']['approxEmployees'], 
      domesticTrafficRank: data['traffic']['topCountryRanking'][0], 
      globalTrafficRank: data['traffic']['ranking'][0] 
      } 
     }); 
     } else { 
     console.log('Data could not be found on the company') 
     } 
    } 
    } 
}); 
+1

'data ['socialProfiles'] [2]'が存在しない場合、あなたは存在をチェックすることを止めていますか? (data ['socialProfiles'] [2] || {})['bio'] 'のようなものですか?それとも、バイオを手に入れることができる別の場所がありますか? – chazsolo

+0

こんにちは@chazsolo:私はあなたが指しているものを広く理解していると思いますが、私は複数のif(typeof data ['socialProfiles'] ['2'] === '私のメソッド内の文 - 私はより洗練された、より洗練されたものを望んでいました。また、meteor.update関数内の存在を確認する方法を知ることはできません。あなたの素早い応答に感謝します - これに感謝してください! Philipp – Philipp

+0

入れ子になったプロパティを扱うときに、オブジェクトの存在をチェックする必要があります。上記のようにインラインで実行することも、 'customerDb.update'を呼び出す前に実行することもできます。そうすれば、呼び出しの前にプッシュするオブジェクトを構築することができます。あなたは '$ push:updatedCustomerData'のようなものを残しておきます。 – chazsolo

答えて

0

@ chazsoloの提案に基づいて、潜在的に欠落しているデータとキーを、JavaScriptのANDとORで処理できます。これは一般的な防御的なコーディングパターンです。

親キーのいずれかが見つからないか、配列要素がない場合、各項目は空の文字列に置き換えられます。何が欠落しているかも知れば、これを単純化することができます。また、これらの場合には文字列ではなく数字を使用することもできます。

if (data['status'] == 200) { 
    const bio = data['socialProfiles'] && data['socialProfiles'][2] && data['socialProfiles'][2]['bio'] || ''; 
    const keywords = data['organization'] && data['organization']['keywords'] || ''; 
    const employees = data['organization'] && data['organization']['approxEmployees'] || '', 
    const domesticTrafficRank = data['traffic'] && data['traffic']['topCountryRanking'] && data['traffic']['topCountryRanking'][0] || '', 
    const globalTrafficRank = data['traffic'] && data['traffic']['ranking'] && data['traffic']['ranking][0] || ''; 

    customerDb.update (
    { company: "Qualify", 'item.clientId': i.toString() }, 
    { $push: { bio, keywords, employees, domesticTrafficRank, globalTrafficRank }} 
    });