2016-03-29 10 views
3

私はJSを3週間前に学び始めたので、簡単なことを見落とすかもしれません。 私は、npmモジュールのperiodic-tableとfacebook-chat-apiを使って、Facebook化学のbot(オランダ語)を作ろうとしています。 周期表に基づくすべての関数は、分子量を得る以外は正常に動作しています。私が分子ではないものを入力すると、他のすべてのケースでこれが起こるのに対し、elseステートメントには行きません。これがケースである:javascriptで/ elseが他に定義されていない場合は

case 'mw': 

    var regex = /((Uu[a-z]|[A-Z][a-z]?)\d*)/g; 
    var mol = (commandText.match(regex) || []).join(' '); 

    if(util.atomicMass != undefined && util.atomicMass(mol) != undefined) { 
     api.sendMessage("De molaire massa van " + commandText + " is: " + util.atomicMass(mol) + " g/mol", event.threadID) 

    } 
    else { 
     api.sendMessage("Fout, onjuiste opmaak", event.threadID) 

    } 

    break; 

私もなく、運と、代わりに

if (util == undefined || (util.atomicMass != undefined && util.atomicMass(mol) != undefined)) { 

を試してみました。

私が手にエラーがある:

ERR! ERROR in listen --> TypeError: Cannot read property 'atomicMass' of undefined 
ERR! ERROR in listen -->  at C:\Users\Bd\node_modules\periodic-table\util.js:16:54 

私はutilは、冒頭で定義されていないと、それは既存の分子とうまく動作しますが。ナンセンス入力では、それは私に希望のエラーを与えることはありません。 console.log(util)は私に{ atomicMass: [Function: atomicMass] }を与えます。

私の全体のコードは次のとおりです。 http://pastebin.com/6u2bMbXF

それともこれが動作しない理由は、それ自体のutilに何か問題があるだろうか?

編集:

if (typeof util.atomicMass(mol) == "object") 

も動作しません。

+0

私はこれが同様に少し生臭いだと思います(EAFP): 'commandText.match(正規表現)|| [] '一致するとnullが返されますが、他の偽の値を返す可能性があります(?) – ippi

+0

正規表現と一致するものを入力してもまだ取得していないものを入力すると、同じエラー。また、正規表現と一致しないものを入力すると、同じエラーが発生します。 – bdbdbd

+0

_ "facebook-chat-api" _このようなことはもうありません... – CBroe

答えて

1

ステートメントを使用します。あなたのコードのための

例:

try { 
    api.sendMessage("De molaire massa van " + commandText + " is: " + util.atomicMass(mol) + " g/mol", event.threadID); 
} catch (e) { 
    if (e instanceof TypeError) { 
    api.sendMessage("Fout, onjuiste opmaak", event.threadID); 
    } else { 
    throw e; 
    } 
} 

確認と投げは必要ありません、あなただけのすべての例外をログに記録し、常にユーザーに同じテキストを送信することができます。

PS:私はそれがよりPython的な方法です、それはJSでは一般的であるかどうかわからないんだけど

+0

ありがとうstek29、これは私のために働いています! – bdbdbd

1

エラーは、periodic-table node_moduleを参照してください。

行16: pt.symbols [vector [1]]を持つものは定義されていません。 nodejsコードをデバッグしたり、console.logを追加して問題の原因を突き止めることができます。

...

}, []) 
.reduce(function(sum, vector) { 
    return sum + (vector[0] * pt.symbols[vector[1]].atomicMass.split('(')[0]); 
}, 0); 

}

...

+0

はい原子16を持たない誤った入力をしようとすると、16行目のatomicMassが未定義になります。だから私のエラーメッセージにも見られるように、これは未定義を返すので、それは奇妙ではありません。私の謎は、それが未定義のときに私のelseステートメントに進むのがなぜではないのかです。 – bdbdbd

+0

これは奇妙なことではありません。存在していないものを解決しようとしています。 ifステートメントは、そのプロパティを扱う前にオブジェクトを参照する必要があります。obj.fooを解決しようとしていて、fooが定義されていない場合。メジャーは発生しませんが、オブジェクトが有効でない場合は発生しません。そのエラーは申し分ない – lastboy

+0

私はどのようにこれを回避することができますあなたのための提案がありますか?私は何日も成功しなかったので、今試しました。 – bdbdbd

関連する問題