mongoose 如何使用mern stack标签查找特定数据?

h4cxqtbf  于 2023-01-02  发布在  Go
关注(0)|答案(1)|浏览(122)

我有后端代码,我想在那里找到一些使用标签的数据。标签将从react前端。我试着像第一个后端代码一样做,我做了find({tags: { $all: ["english"] } })。我想只是用前端的参数替换["english]数组做同样的事情。但它就是不工作。
我只想找到一个可行的解决方案,可以使用前端的标记找到特定的数据。
后端1:

router.get("/", (req, res) => {
  Test.find({ tags: { $all: ["english"] } }).then((items) => res.json(items));
});

后端2:

const Test = require("../../models/test");

router.get("/:tags", (req, res) => {
  const query = req.params.tags;
  Test.find({ tags: { $all: [query] } }).then((items) => res.json(items));
});

前端:

export default function Test() {

  useEffect(() => {
    fetchItems();
  }, []);

  const fetchItems = async () => {
    const tags = ["english", "noun"]
    const res = await fetch(`/api/test/${tags}`);
    const data = await res.json();
    console.log(data)
  };
  return (
    <div>Hi</div>
  );
}

数据:

[
  { "q": "What is english?", "tags": ["english"] },
  { "q": "What is noun?", "tags": ["english", "noun"] },
  { "q": "What is pronoun?", "tags": [ "english", "pronoun"] }
]

编辑:当我使用fetch发送get请求时:const res = await fetch(/api/test/${tags});,请求如下所示:http://localhost:5000/api/test/english,noun.
在请求字符串中使用逗号发送请求是否是一种好方法?
编辑2:对于请求字符串中的逗号问题,我是这样做的。看起来像我期望的那样工作。前面:

const fetchItems = async () => {
    const tags = ["english", "noun"]
    const tags_params = tags.map((l)=>'tags='+encodeURIComponent(l)).join('&')
    const res = await fetch(`/api/test/?${tags_params}`);
    const data = await res.json();
  };

后端:

const Test = require("../../models/test");

router.get("/", (req, res) => {
  Test.find({ tags: { $all: req.query.tags } }).then((q) => res.json(q));
});
li9yvcax

li9yvcax1#

您应该拆分“req.params.tags”以将其转换为数组。
我知道您用[ ]将查询变量括起来,如下所示:
{标签:{ $全部:[查询] } }
但这不会把元素单独放进数组,而是把整个字符串作为一个元素放进数组.
检查以下示例:
我的路线:

router.get('/test-for-nasem/:tags', async(req, res) => {
try {
    const query = req.params.tags;
    const arr = query.split(',');

    res.send({
        'query-length': [query].length,
        'query': [query],
        'query[0]': [query][0],
        '-----------------------': '',
        'arr-length': arr.length,
        arr,
        'arr[0]': arr[0],
    });
}
catch (error) {
    handleError(error, req, res);
}

});
当我向这个路由发出请求时,比如http://localhost:3002/test-for-nasem/apple,香蕉使用 Postman :

从API结果可以看出,query不是您想要的数组,而arr是。

另一方面,有多种方法可以通过HTTP GET请求发送数组参数。
当查询参数在请求URL中重复多次时,Express会将其公开为数组:

app.get('/', function(req, res, next) {
console.log(req.query.tags)
   res.send(200)
}

GET /?tags=apple&tags=banana
// query.tags is ['apple', 'banana']

这同样适用于其他方法中的req.body。
您也可以使用带有逗号的格式,并在后端拆分参数。

相关问题