2017-06-20 8 views
0
// DemoTable with id 999 does not exist  
    DemoTable.findOne(999, function(err, found) { 
    DemoTable.destroy(found.id, function(err, destroyed) { 
    // destroys the whole DemoTable 
    }); 
    }); 

私はSails.jsでオンラインゲームをプログラミングしていましたが、そのような結果は6ヶ月で約10回起こりました。このプロジェクトはまだリリースされておらず、DBを再作成するのに苦労もしませんでした。Sails.js - 未定義の "id"を与えるとすべてのレコードが破棄されます

私は同じように、余分なチェックをしていた。とにかく

DemoTable.findOne(999, function(err, found) { 
     if(found === undefined || found.id === undefined) return false; 
     DemoTable.destroy(found.id, function(err, destroyed) { 
      // does not destroy the whole DemoTable 
     }); 
    }); 

しかし...このdidntの助けを、私は一度事故を行なったし、タイプミスをした、のように:

DemoTable.find(999, function(err, found) { 
     if(found[0] === undefined || found[0].id === undefined) return false; 
     DemoTable.destroy(found.id, function(err, destroyed) { 
      // destroyed the whole DemoTable 
     }); 
    }); 

と私はすでに持っていました私のゲームで10人のプレイヤー(テスター)のように、今それらはすべて削除されました。

私はこれを一度限り解決しなければなりません。 定義されていない値を与えると、私のDB全体がテーブルを削除しないように保護する方法はありますか?私はSails.jsを使用しています。

*編集*私のモデルは次のようになります。

module.exports = { 
    attributes: { 
    piece:  { type:'string' }, 
    shots:  { type:'text' }, 
    from_x:  { type:'integer' }, 
    to_x:   { type:'integer' }, 
    from_y:  { type:'integer' }, 
    to_y:   { type:'integer' }, 
    duration:  { type:'integer' }, 
    pawn_id:  { type:'integer' }, 
    building_id: { type:'integer' }, 
    user_id:  { type:'integer' }, 
    health:  { type:'integer' }, 
    level:  { type:'integer' }, 
    fighting:  { type:'string' }, 
    chess:  { type:'string' }, 
    createdAt: { 
     type: 'datetime', 
     columnName: 'createdat' 
    }, 
    updatedAt: { 
     type: 'datetime', 
     columnName: 'updatedat' 
    }, 

    toJSON: function() { 
     var obj = this.toObject(); 
     delete obj._csrf; 
     return obj; 
    } 
    }, 
    beforeDestroy: function(criteria, cb) { 
    if (!criteria) { 
     return cb(new Error('Empty criteria')); 
    } 
    } 
}; 

答えて

1

はDemoTable.jsモデル(Doc)でbeforeDestroyを実装します。このような
何か:

beforeDestroy: function(criteria, cb) { 
    if (!criteria) { 
    return cb(new Error('Empty criteria')); 
    } else { // Added else part 
    return cb(); 
    } 
} 

また、コールバックの最初のerrを扱う方が良いでしょう。 Like:

DemoTable.findOne(999, function(err, found) { 
    if(err) { // Error handling if-block 
     // Handle error as you like 
     return false; 
    } 
    if(found === undefined || found.id === undefined) return false; 
    DemoTable.destroy(found.id, function(err, destroyed) { 
     // does not destroy the whole DemoTable 
    }); 
}); 
+0

Thx!それは良い解決策のように思えます:) – mansim

+0

うーん、うまくいきません。私は例のようにDocsのような属性の下に追加しましたが、破壊しようとするとアイテムは破壊されず、定義されていないコールバックしか得られず、エラーも結果もなくなり、破壊は終了しません。 – mansim

+0

ライフサイクルコールバック関数はモデル内の 'attributes'の下に**ありません**。 [密接に]インデントを確認してください(http://sailsjs.com/documentation/concepts/models-and-orm/lifecycle-callbacks#?example) – Sangharsh

関連する問題