Js mysql 查询不使用 GET 请求给出的布尔值

Js mysql query not using boolean value given with GET request

我正在尝试在 MySQL 数据库中搜索 activeinactive 值为 isActive 的用户,想法是 GET 请求 isActive=trueisActive=false 一起发送,所有活跃或不活跃的用户都将在响应中发送。问题是 isActive 值没有被使用,我只能通过将它硬编码到 SQL 查询中来让它工作。

当我发送一个定义了 firstName 值的请求时它确实有效,所以我认为这可能与 isActiveboolean 并且没有正确转换有关,但是我没能解决这个问题。

此外,我正在为数据库使用 MySQL2

如有任何帮助,我们将不胜感激。

    getUsers: (req, res, next) => {
        const queryParams = req.query
        logger.debug(queryParams)

        let { firstName, isActive } = req.query
        
        let queryString = 'SELECT * FROM `user`'
        if (firstName || isActive) {
            queryString += ' WHERE '
            if (firstName) {
                queryString += '`firstName` LIKE ?'
                firstName = '%' + firstName + '%'
            }
            if (firstName && isActive) queryString += ' AND '
            if (isActive) {
                queryString += '`isActive` = ?'
            }
        }
        queryString += ';'
        logger.debug(`queryString = ${queryString}`)

        dbconnection.getConnection(function (err, connection) {
            if (err) next(err) // not connected!

            // Use the connection
            connection.query(queryString, [firstName, isActive], function (error, results) {
                    // When done with the connection, release it.
                    connection.release()

                    // Handle error after the release.
                    if (error) next(error)

                    // Don't use the connection here, it has been returned to the pool.
                    logger.debug('#results = ', results.length)
                    res.status(200).json({
                        status: 200,
                        results: results,
                    })
                }
            )
        })
    },

这是我调用 GET 方法时的日志:

2022-05-20T14:16:12Z [DEBUG] user.controller.js:66 : { isActive: 'false' }
2022-05-20T14:16:12Z [DEBUG] user.controller.js:83 : queryString = SELECT * FROM `user` WHERE `isActive` = ?;
2022-05-20T14:16:13Z [DEBUG] dbconnection.js:23 : Connected to database '2186751'
2022-05-20T14:16:13Z [DEBUG] dbconnection.js:27 : Connection 46 acquired
2022-05-20T14:16:13Z [DEBUG] dbconnection.js:31 : Connection 46 released
2022-05-20T14:16:13Z [DEBUG] user.controller.js:97 : #results =  0

firstNameisActiveMySQL 数据库中的定义:

  `firstName` varchar(255) NOT NULL,
  `isActive` tinyint NOT NULL DEFAULT '1',

您需要将 true/false 转换为 1/0 以获得 MySQL 以理解布尔值。

此外,由于您是动态构建查询字符串,因此还必须动态构建参数数组,以便参数与占位符相匹配。

getUsers: (req, res, next) => {
  const queryParams = req.query
  logger.debug(queryParams)

  let {
    firstName,
    isActive
  } = req.query

  let queryString = 'SELECT * FROM `user`'
  let params = [];
  if (firstName || isActive) {
    queryString += ' WHERE '
    if (firstName) {
      queryString += '`firstName` LIKE ?'
      firstName = '%' + firstName + '%'
      params.push(firstName);
    }
    if (firstName && isActive) queryString += ' AND '
    if (isActive) {
      queryString += '`isActive` = ?'
      params.push(isActive == 'true' ? 1 : 0);
    }
  }
  queryString += ';'
  logger.debug(`queryString = ${queryString}`);
  logger.debug(`params = ${JSON.stringify(params)}`)

  dbconnection.getConnection(function(err, connection) {
    if (err) next(err) // not connected!

    // Use the connection
    connection.query(queryString, params, function(error, results) {
      // When done with the connection, release it.
      connection.release()

      // Handle error after the release.
      if (error) next(error)

      // Don't use the connection here, it has been returned to the pool.
      logger.debug('#results = ', results.length)
      res.status(200).json({
        status: 200,
        results: results,
      })
    })
  })
},