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 || ''
 ])