0

node-mysql を使用しています。

1削除クエリに渡すと、テーブル全体が削除されることに気付きました。これは私の構文では理にかなっていますが、偶発的なドロップから保護したいと考えています。

現在、 を使用してクエリにオブジェクトを渡すようにすることで、これを防いでいますtypeof。これは信頼できますか?

exports.destroy = function (sel, next) {
  if (typeof sel !== 'object') {
    //it defaults to id if you don't sepcify and object.
    sel = {'id' : sel};
  }
  db.query('DELETE FROM users WHERE ?', sel, next);
};
4

1 に答える 1

1

まず、テーブルが削除されるのではなく、すべての行が削除されます。次に、「<a href="https://github.com/felixge/node-mysql#escaping-query-values" rel="nofollow">準備済みステートメント」を使用します。

以下はやや肥大化していますが、主なアイデアは に似た関数を使用することremoveQueryです。等式とは異なる条件が必要な場合は、変更されたバージョンに次のような文字列として渡すことができますpost_rating < ?(ユーザーではなく、結果の sql は次のようになりますDELETE FROM posts WHERE post_rating < ?;)。

ただし、検証、スキーマ、および同様のものは、何らかのORMに移動する必要があります。

var util = require('util');

var db = {
  query: function (sql, params, callback) {
    console.log('executing sql `%s` with params `%j`', sql, params);
    callback();
  }
};

function removeQuery(db, table, whereField, type) {
  var sql = util.format('DELETE FROM %s WHERE %s = ?;', table, whereField);
  var fn  = db.query.bind(db, sql);

  return function (value, callback) {
    callback = callback || function () {};
    if (typeof value != type) {
      var message = util.format('Invalid type of `%s` field: should be `%s`; got `%s`',
                                whereField, type, typeof value);
      var err = new Error(message);
      console.error(err);
      return process.nextTick(callback.bind(null, err));
    }

    fn([value], callback);
  };
}

exports.removeUserByUsername = removeQuery(db, 'users', 'username', 'string');
exports.removePostByUserId   = removeQuery(db, 'posts', 'user_id', 'number');

[42, 'tony', undefined].forEach(function (val) {
  exports.removeUserByUsername(val);
  exports.removePostByUserId(val);
});
于 2012-12-22T11:35:18.670 に答える