在SQL查询

时间:2018-05-17 20:03:58

标签: sql node.js

我有一个通用的API调用,我想在我的数据库中的不同表中使用它。这是SQL查询

SELECT * FROM $column_name WHERE step != Failed

我想这样做,通过做这样的事情来避免sql注入的可能性

var type = req.params.type;
var sql = 'SELECT * FROM ? WHERE step != FALSE';
postgres.client.query(sql, [ type ], function(err, results) {}

这不起作用,并抛出语法错误。我做了一些探测并尝试做1美元,而不是?但没有任何效果。我确实验证了类型变量是正确的值。

当我运行时,

var type = req.params.type;
var sql = 'SELECT * FROM ' + type + ' WHERE step != FALSE';
postgres.client.query(sql, [ type ], function(err, results)

工作正常。这是什么交易??

1 个答案:

答案 0 :(得分:1)

据我了解,您使用node-postgres(别名:pg)模块。

对于该模块,没有???替换。

您使用$N表示法,但pg驱动程序不允许使用动态表名。

所以这里的解决方法:

1)创建constants/tableNames.js文件,其中包含要使用的允许表名列表:

module.exports = [
  'users',
  'profiles', 
  ... and etc tables that You have
];

2)使用以下内容创建db/queries/selectFromTable.js,该内容将负责使用允许的表名中的检查表名来生成查询:

const tableNames = require('../../constants/tableNames.js');
module.exports = (tableName, queryTail = 'WHERE step != FALSE') => {
  if (tableNames.includes(tableName)) {
    return 'SELECT * FROM '+tableName+' '+queryTail; 
  }
  return 'SELECT NULL';
};

3)并在您的代码中使用它,例如:

const selectFrom = require('db/queries/selectFromTable.js');

app.get('/records/:table', async (req, res) => {
  try {
    const table = req.params.table;
    const query = selectFrom(table); 
    const result = await postgres.client.query(query, []);
    res.status(200).send(result.rows);

    /**
     * OR:
     * const table = req.params.table;
     * const something = req.query.something;
     * const query = selectFrom(table, 'WHERE step != FALSE AND something = $1::text');
     * const result = await postgres.client.query(query, [something]);
     * res.status(200).send(result.rows);
     */
  }
  catch (error) {
    res.status(500).send(error);
  }
});