简体   繁体   English

处理复杂的查询参数 Express.Js

[英]Handling complex query parameters Express.Js

I'm making REST APIS with Express.js I have the following express route:我正在使用 Express.js 制作 REST APIS 我有以下快速路线:

/api/customer

I added multiple query params to the route like this:我向路由添加了多个查询参数,如下所示:

/api/customer?name=jake
/api/customer?country=america
/api/customer?name=jake&country=america 
/api/customer?name=jake&limit=10

In my controllers I handle all of these with If and there are so many cases I feel that this method would not scale, is there a better way of handling this ?在我的控制器中,我使用 If 处理所有这些,并且有很多情况我觉得这种方法无法扩展,有没有更好的方法来处理这个?

This is the code for my controller, I'm using Sequelize to query the database:这是我的控制器的代码,我使用 Sequelize 来查询数据库:

async function getAllCustomer(queryLimit, page) {  
  const customers = await Customer.findAll({
    limit: queryLimit ? parseInt(queryLimit) : null,
    offset: page ? parseInt(queryLimit) * parseInt(page) : null
  });
  
  return customers;
}

async function getCustomerByFirstName(name, queryLimit, page) {
  return await Customer.findAll({
    where: {
      firstName: name,
    }
  })
}

async function getCustomerByAddress(address) {
  return await Customer.findAll({
    where: {
      customerAddress: address
    }
  })
}

async function getCustomerByNameAddress(name, address) {
  return await Customer.findAll({
    where: {
      [Op.and]: [
        {firstName: name},
        {customerAddress: address}
      ]
    }
  })
}

async function getCustomer(req, res) {
  const page = req.query.page;
  const queryLimit = req.query.limit;
  const name = req.query.name;
  const address = req.query.address;
  
  let customers;
  /* User want to find first names */
  if (name && !address) {
    const names = name.split(",")

    customers = await getCustomerByFirstName(names, queryLimit, page)


    res.status(200).send(customers)
    return;
  }

  /* User want to find addresses */
  if (!name && address) {
    const addresses = address.split(",")
    customers = await getCustomerByAddress(addresses, queryLimit, page)
    res.status(200).send(customers)
    return;
  }

  /* User want to mix both */
  if (name && address) {
    const names = name.split(",")
    const addresses = address.split(",")
    customers = await getCustomerByNameAddress(names, addresses, queryLimit, page)    

    res.status(200).send(customers)
    return;
  }

  if (!name && !address) {
    customers = await getAllCustomer(queryLimit, page)
    res.status(200).send(customers)
    return;
  }
}

You could do something like this:你可以这样做:

async function getCustomer(req, res) {
  const page = req.query.page;
  const queryLimit = req.query.limit;
  const name = req.query.name;
  const address = req.query.address;
  
  let query = { };
  if(name) {
    query.firstName = name;
  }
  
  if(address) {
    query.address = address;
  }
  
  let customers = await getCustomers(query, queryLimit, page);
  res.status(200).send(customers)
  return;
}

async function getCustomers(query, queryLimit, page) {  
  const customers = await Customer.findAll({
    where: query,
    limit: queryLimit ? parseInt(queryLimit) : null,
    offset: page ? parseInt(queryLimit) * parseInt(page) : null
  });
  
  return customers;
}

BTW, in your code, the functions getCustomerByFirstName , getCustomerByAddress and getCustomerByNameAddress are expecting to receive name and address as string parameter, but you are passing names and addresses array.顺便说一句,在您的代码中,函数getCustomerByFirstNamegetCustomerByAddressgetCustomerByNameAddress期望接收nameaddress作为字符串参数,但您传递的是namesaddresses数组。 This might lead to errors...这可能会导致错误...

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM