4

たとえば、次の URL を見てください: https://api.eveonline.com/eve/CharacterID.xml.aspx?names=Khan

xml2js node.js モジュールを使用すると、見栄えはよくありませんが、その XML を解析できます。

var CharacterID = response.eveapi.result[0].rowset[0].row[0].$.characterID;

行セット [0]が定義されていなかったため、アプリは 2 週間の実行後にクラッシュしました。それ以前は、eveapiが定義されていないためにクラッシュしていました。真剣に、愚かな未定義のオブジェクトエラーが原因でサーバーがクラッシュするのを防ぐためだけに、 if-elseをこのようにする必要がありますか?

 if (!response.eveapi || 
     !response.eveapi.result[0] || 
     !response.eveapi.result[0].rowset[0] || 
     !response.eveapi.result[0].rowset[0].row[0]) {
            return res.send(500, "Error");

該当する場合の明らかなif (err) return res.send(500, "Error");エラー処理以外に、未定義エラーの一般的な慣行は何ですか?

4

3 に答える 3

4

私はこの種のもののための dotty ( https://github.com/deoxxa/dotty ) と呼ばれるライブラリを作成しました。

あなたの場合、これを行うことができます:

var dotty = require("dotty");

var CharacterID = dotty.get(response, "eveapi.result.0.rowset.0.row.0.$.characterID");

パスが解決できない場合は、undefined が返されます。

于 2013-06-28T08:03:37.517 に答える
3

あなたが発見したように、未定義自体はエラーではありませんが、未定義を配列/オブジェクトとして使用するとエラーになります。

x = {'a': { 'b': { 'c': { 'd': [1,2,3,4,5]} } } } ;
try { j = x.a.b.c.e[3] } catch(e) { console.log(e); }

版画

[TypeError: Cannot read property '3' of undefined]

これは、コードで try/catch を使用してエラー コードを返し、必要に応じてエラー テキストを返すことができることを示唆しています (または、エラー テキストを console.log、データベース、またはローカル ファイルに貼り付けます)。

あなたの場合、それは次のようになります。

var CharacterID; // can't define it yet

try {
  CharacterID = response.eveapi.result[0].rowset[0].row[0].$.characterID;
} catch(e) {
// send description on the line with error
  return res.send(500, "Error: NodeJS assigning CharacterID: "+e); 
// return res.send(500, "error");  use this one if you dont want to reveal reason for errors
}

// code here can assume CharacterID evaluated.  It might still be undefined, though.
于 2013-06-28T06:17:49.043 に答える