mongodb 当我通过req.query boolean和number解析为json时,它变成了string,find()什么也找不到

gajydyqb  于 2023-08-04  发布在  Go
关注(0)|答案(2)|浏览(133)

后端(nodejs)

async getAllEvents(req, res, database, collection) {
    try {
      const { filter, sort } = req.query;

      const events = await mongo
        .getClient()
        .db(database)
        .collection(collection)
        .find(filter)
        .sort(sort)
        .toArray();

      res.json(events);
      res.end();
    } catch (error) {
      return res.status(400).json({ message: "err_get_events" });
    }
  }

字符串

前端(React)

const getAllEvents = async () => {
    const query = settings.query;
    await axios
      .get(Constants.BASE_URL + '/' + settings.urlprefix + '/get', { params: { filter: { helped: true }, sort: { dateAdded: -1 } } })
      .then((res) => {
        setEvents(res.data);
      })
      .catch((err) => console.log(err?.response?.data?.message));
  };


我从console.log中获取的后端:{ filter: { helped: 'true' }, sort: { dateAdded: '-1' } }helpedsort成为字符串
当我把{ helped: 'true' }传递给mongo时,find()没有给予任何结果,因为在mongo中我存储的是布尔值。

查询解析后,如何在后端得到正确的变量类型?

lmvvr0a8

lmvvr0a81#

boolean在发送到mongo之前很久就变成了一个字符串。HTTP是一个基于文本的协议,无论你在URL中发送的GET参数是一个字符串,它的服务器的责任是将其转换为适当的数据类型。
请阅读How can I convert a string to boolean in JavaScript?的灵感如何做转换适合您的用例。

y1aodyip

y1aodyip2#

最初,我想使用一个NPM包来转换所有接收到的json,使其自动化,并避免未来对后端代码的任何关注。但显然我没有耐心在这个问题上纠缠下去。我提出了临时解决方案:

async getAllEvents(req, res, database, collection) {
    try {
      const { filter, sort } = req.query;

      if (filter) filter.helped = JSON.parse(filter.helped);
      if (sort) sort.dateAdded = JSON.parse(sort.dateAdded);

      const events = await mongo
        .getClient()
        .db(database)
        .collection(collection)
        .find(filter)
        .sort(sort)
        .toArray();

      res.json(events);
      res.end();
    } catch (error) {
      return res.status(400).json({ message: "err_get_events" });
    }
  }

字符串

相关问题