英文:
When i parse by req.query boolean and number to json it becomes string. Mongo .find() finds nothing
问题
以下是您要翻译的代码部分:
Back end (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" });
    }
  }
Front end (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));
  };
在后端控制台中我得到的是:{ filter: { helped: 'true' }, sort: { dateAdded: '-1' } },并且 helped 和 sort 变成了字符串。
当我将 { helped: 'true' } 传递给 mongo.find() 时,没有返回任何结果,因为在MongoDB中我存储的是布尔值。
在查询解析后,如何在后端获得正确的变量类型?
英文:
Back end (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" });
    }
  }
Front end (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));
  };
on backend i got from console.log: { filter: { helped: 'true' }, sort: { dateAdded: '-1' } } and helped and sort become string
When i pass { helped: 'true' } to mongo .find() not give any results, because in mongo i store boolean.
How can i got correct types of variables on the back end side after query parsing?
答案1
得分: 1
布尔值在发送到Mongo之前就已经变成了字符串。HTTP是一种基于文本的协议,无论您将其作为GET参数发送到URL中的内容都是字符串,由服务器负责将其转换为适当的数据类型。
请参阅https://stackoverflow.com/questions/263965/how-can-i-convert-a-string-to-boolean-in-javascript以获取有关如何执行适合您用例的转换的灵感。
英文:
The boolean becomes a string long before it is sent to mongo. HTTP is a text based protocol, whatever you send in the URL as a GET parameter is a string, and it's server's responsibility to convert it to appropriate data type.
Please read https://stackoverflow.com/questions/263965/how-can-i-convert-a-string-to-boolean-in-javascript for inspiration how to do the conversion suitable to your usecase.
答案2
得分: 0
起初,我想使用一个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" });
    }
}
请注意,我只翻译了代码部分,没有包括您的问题或其他内容。
英文:
Initially, I wanted to use a NPM package to convert all received json, to make it automatically and avoid any future care about backend code. But apparently i did not have the patience to dwell on this problem further. And i made temporuary solution:
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" });
    }
  }
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论