0

我正在使用节点-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 回答