postgres和nodejs服务器的分页查询



我试图通过使用order和odertype然后限制和偏移定义查询从我的数据库中获得所有用户。但是,在按照给定的方式编写查询时,我使用了参数化形式,因为它没有返回任何结果。遇到的错误是$1和$2附近有问题。


const getPagination = (page, size) => {
const limit = size ? +size : 4;
const offset = page ? page * limit : 0;
return { limit, offset };
};
var getUsers =async(req,res)=>{
let orderby = req.query.orderby
? req.query.orderby
: "user_id";
console.log(orderby)

let orderDir = req.query.orderDir
? req.query.orderDir
: "DESC";
const { page, size } = req.query;
const { limit, offset } = getPagination(page, size);
const query='SELECT * FROM users ORDER BY $1 $2 LIMIT $3 OFFSET $4'
await db.query(query,[orderBy,orderDir,limit,offset])
.then(data => {
console.log(data)
res.json(data.rows);
})
.catch(err => {
res.status(500).send({
message:
err.message || "Some error occurred while retrieving users."
});
});
}

出现错误的可能原因是orderBy/orderDir作为字符串传递到查询中,而不是作为原始sql。这将给出如下查询:

SELECT * 
FROM users
ORDER BY 'colName' 'ASC'

其中order by现在是一个常量字符串,因此条目根本没有排序,并且方向周围的引号确实会抛出错误。

插入到查询的方向可能最好是通过替换$2在查询类似${低(orderDir) === 'asc' ?'ASC': 'DESC'}并将查询字符串中的's替换为's。

对于要排序的列,最好定义orderBy可以取哪些值,检查是否给出了正确的输入,然后使用if语句创建一个字符串以插入查询。只要插入的字符串是在代码中创建的,而不是未经处理的用户输入,就没有sql注入的风险,查询应该按预期工作。

最新更新