URL 中的问号已随 Express Route Parameters 一起删除。我怎样才能得到带有问号的标题 post? (节点.js/Express/MongoDB)

Question mark in URL is removed with Express Route Parameters. How can I get a post by title with a question mark? (Node.js/Express/MongoDB)

我试图通过标题查找和检索 post 但它失败了,当我控制台日志 requestedTitle = req.params.postTitle 它显示?从http://localhost:1035/posts/Is%20Google%20Analytics%20is%20中删除非法?只是“Is Google Analytics is illegal”找不到标题为“Is Google Analytics is illegal?”的文章有一个?。

  app.get('/posts/:postTitle', function (req, res) {
      //single blog post
      // const postId = req.params.postId
      const requestedTitle = req.params.postTitle
      Post.findOne({title: requestedTitle}, function (err, post) {
        console.log(requestedTitle);
        if (post) {res.render('post', {
          singleTitle: post.title,
          singleContent: post.content,
          singleAuthor: post.author,
          uploadedImg: post.img,
          postCreated: post.created_at
      })} else {
        res.send(`No "${requestedTitle}" article was found.`)
      }

Express(根据 http 规范)将问号解释为 URL 查询字符串的定界符。因此,Express 已经解析出查询字符串并且与您的路由不匹配。解析后的查询字符串将在 req.query.

因此,如果您发送 URL 请求,例如:

http://localhost:1035/posts/Is%20Google%20Analytics%20is%20illegal?

然后,? 将被视为查询字符串的分隔符,您的 postTitle 将只是 Is Google Analytics is illegal.

如果您希望问号成为您在 postTitle 中获得的内容的一部分,则客户端必须在构造 [=] 之前使用 encodeURIComponent() 正确编码 postTitle 35=]。这将从 Express 中“隐藏”?(它将被编码为 %3F,然后它将作为 ? 的解码值保留在 postTitle 中。

仅供参考,还有许多其他字符也被保留,所以任何 end-user 您想要放入 URL 的内容必须是 postTitle在构造 URL 时用 encodeURIComponent() 编码。请注意,您不会在整个 URL 上调用 encodeURIComponent(),而只是在成为 postTitle 的那部分用户数据上调用。然后 Express 将为您处理解码。