Mysql 如何将url查询字符串解析为nodejs sql客户端
我想知道是否有人可以帮助解析具有多种类型的查询字符串Mysql 如何将url查询字符串解析为nodejs sql客户端,mysql,node.js,knex.js,Mysql,Node.js,Knex.js,我想知道是否有人可以帮助解析具有多种类型的查询字符串 /api/v1/users?isFree=true&numberOfDays=23&name=Alice用于此查询 从isFree=true、numberOfDays=23、name=“Alice”的用户中选择*。我使用mysql2库尝试了此函数: async function findUsers(query) { // query would be parsed by expressjs as {isFree: 'true', number
/api/v1/users?isFree=true&numberOfDays=23&name=Alice
用于此查询
从isFree=true、numberOfDays=23、name=“Alice”的用户中选择*
。我使用mysql2库尝试了此函数:
async function findUsers(query) { // query would be parsed by expressjs as {isFree: 'true', numberOfDays: '23', name: 'Alice'}
let queryString = "";
let values = [];
if (query != null) {
const parsed = parseData(query);
values = parsed.values;
queryString = " where " + parsed.string.join(", ");
}
const out = await pool.query(queryString, values);
queryString = "select * from users" + queryString; // queryString passed is " where isFree = ? "
return (await pool.query(queryString, ["true"]))[0];
}
我主要关心的是,可以解析为布尔值和数字的项被保留为字符串。我应该像这样建立自己的逻辑吗
function convertBooleans(options) {
for (let key in options) {
if (options[key] === "true") {
options[key] = true;
} else if (options[key] === "false") {
options[key] = false;
}
}
return options;
}
我对走这条路感到恶心。我尝试使用knex,但这并没有解决混合类型都作为字符串传递的问题。谢谢大家! 你能试试这样的吗-
var url = require('url');
var url_parts = url.parse(req.url, true);
var query = url_parts.query;
var isFree= query.isFree;
var numberOfDays= query.numberOfDays;
var name= query.name;
在查询之前,应该验证或转换输入,如
req.query.isFree=!!请求查询是免费的
然后您可以(始终使用准备好的查询,不信任用户输入)构建准备好的查询:
let keys = Object.keys(query)
let values = Object.values(query)
keys = keys.filter(v => ['isFree', 'numberOfDays', 'name'].includes(v))
let sql = 'SELECT * FROM vendors'
if (keys.length) sql += ` WHERE \`` + keys.join('` = ? AND `') + `\` = ?`
let result = await this.query(sql, values)
如果您正在寻找比knex更简单/更轻的东西,请看一看(我是唯一的贡献者;p),然后它将与以下内容一样简单:
let vendors = await database.findOne(
'vendors',
'isFree = ? AND numberOfDays = ? AND name = ?', [
!!req.query.isFree,
parseInt(req.query.numberOfDays, 10),
req.query.name || ''
])