NodeJS 转换错误:值“{ '$lte'”的转换为数字失败:模型“User”的路径“profile.age”处的“100' }”(对象类型)

cuxqih21  于 2023-02-08  发布在  Node.js
关注(0)|答案(3)|浏览(85)

我有一个mongo模式,看起来像这样:

const UserSchema = new mongoose.Schema({
  profile: {
    // ...other stuff
    age: {
      type: Number,
      min: [18, "Min age is 18"],
      max: [99, "Max age is 99"],
    },

我试图通过 Postman 查询它与以下:/users?profile.age[lte]=100
其他查询也可以工作,例如users?profile.age=36。这将返回正确的结果数,users?profile.age[eq]=36也是如此。它们都返回正确的结果数。
在我的控制器中,我有:

export const getUsers = asyncHandler(async (req, res, next) => {
  let query;
  let queryStr = JSON.stringify(req.query);

  queryStr = queryStr.replace(
    /\b(gt|gte|lt|lte|in|elemMatch|eq)\b/g,
    (match) => `$${match}`
  );

  query = JSON.parse(queryStr);

  const users = await User.find(query);

  if (!users) {
    next(new ErrorResponse(`Unable to get users.`, 500));
  } else {
    res.status(200).json({
      success: true,
      count: users.length,
      data: users,
    });
  }
});

在这里记录查询将得到{ 'profile.age': { '$lte': '36' } },我认为它是正确的
所以基本上每次我使用ltltegtgte时,它都会抛出这个错误:
CastError: Cast to Number failed for value "{ '$lte': '36' }" (type Object) at path "profile.age" for model "User"
任何帮助都很感激。
谢谢!
编辑:我还尝试了query-to-mongo,以防我处理查询不正确,但它返回相同的错误。
编辑2:即使只是这样:

const users = await User.find({
    "profile.age": { $lte: 100 },
  });

返回错误

xdnvmnnf

xdnvmnnf1#

我也面临同样的问题。 Mongoose 不能过滤数字串。所以我想出了这个主意。下面的函数检查多达2级。希望这将为您工作

const convertNumericStringToNumber = (obj) => {
  const res = {};
  for (const key in obj) {
    if (typeof obj[key] === "object") {
      res[key] = {};
      for (const prop in obj[key]) {
        const parsed = parseInt(obj[key][prop], 10);
        res[key][prop] = isNaN(parsed)
          ? obj[key][prop]
          : parsed;
      }
      continue;
    }
    const parsed = parseInt(obj[key], 10);
    res[key] = isNaN(parsed) ? obj[key] : parsed;
  }
  return res;
};
9q78igpj

9q78igpj2#

我是这样设计的:

export const getUsers = asyncHandler(async (req, res, next) => {
  let query;
  let queryStr = JSON.stringify(req.query);

  queryStr = queryStr.replace(
    /\b(gt|gte|lt|lte|in|elemMatch|eq)\b/g,
    (match) => `$${match}`
  );

  query = JSON.parse(queryStr);

  const users = await User.aggregate([
    {
      $match: convertNumericStringToNumber(query),
    },
  ]);

  if (!users) {
    next(new ErrorResponse(`Unable to get users.`, 500));
  } else {
    res.status(200).json({
      success: true,
      count: users.length,
      data: users,
    });
  }
});

我不知道为什么User.aggregate工作而User.find()不工作,但这似乎是以完全相同的方式工作。

omhiaaxx

omhiaaxx3#

如果将sanitizeFilter设置为true,则将其重新设置为false可能会解决此问题。

相关问题