2012-12-21 23 views
0

我正在使用node-mysql。防止在node-mysql中使用typeof進行刪除

我注意到,當我通過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); 
}; 

回答

1

首先,它不是表被刪除,但所有行都被刪除。其次,使用「prepared statements」。

以下有些臃腫,但主要想法是使用功能類似於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); 
});