【问题标题】:Express routing with query String带有查询字符串的快速路由
【发布时间】:2020-04-10 07:52:47
【问题描述】:

我目前正在尝试 node & express。该项目是一个小型电影库。今天我尝试实现对电影标题的搜索,我遇到的问题是当我提交表单并获取我的查询字符串时,像这样http://localhost:3000/movies/?title=Hustlers 我得到了我数据库中的所有数据。但是当我像http://localhost:3000/movies/title=Hustlers 这样手动输入网址时,它工作正常,我得到了匹配的结果。我试图改变我的路线,但我现在卡住了。

这里是movies.js

const express = require("express");
const router = express.Router();
const Movie = require("../models/movie");

//Get Back all the movies
router.get("/", async (req, res) => {
  try {
    const movies = await Movie.find();
    res.json(movies);
  } catch (err) {
    res.json({ message: err });
  }
});

//specific Movie
router.get("/title=:title", async (req, res) => {
  try {
    const movie = await Movie.find({ title: req.params.title });
    res.json(movie);
  } catch (err) {
    res.json({ message: err });
  }
});

module.exports = router;

我的 app.js

const express = require("express");
const bodyParser = require("body-parser");
const app = express();
const mongoose = require("mongoose");
const cors = require("cors");
require("dotenv/config");

//Middlewares
app.use(bodyParser.json());
app.use(cors());
app.use(express.urlencoded());


const moviesRoute = require("./routes/movies");
app.use("/movies", moviesRoute);
app.use(express.static(__dirname + "/"));

mongoose.connect("mongodb://localhost:27017/testDB", { useNewUrlParser: true });
app.listen(3000);

我在这里提交表单

 <form action="/movies/">
       <input type="text" name="title" />
         <input
          type="submit"
          value="Suchen"
          class="btn btn-primary btnNewMovie"
        />
  </form>

【问题讨论】:

  • “?”在您的第一个 localhost 地址中使 title 成为查询参数,而不是路由参数。获取查询参数,例如。 http://localhost:3000/movies?title=Hustlers,使用req.query.title 而不是req.params.title
  • 我像你说的那样改变了它,但我仍然得到所有电影,而不仅仅是我正在搜索的电影。

标签: javascript node.js mongodb express


【解决方案1】:

= 搞砸了,因为该字符是为查询组件保留的。它看起来也像/title/movie_title 一样干净得多。试试这个:

router.get("/title/:title", async (req, res) => {
  try {
    const movie = await Movie.find({ title: req.params.title });
    res.json(movie);
  } catch (err) {
    res.json({ message: err });
  }
});

【讨论】:

  • 我尝试了您的解决方案,但仍然无法正常工作。仍然获得所有电影,而不仅仅是我正在搜索的电影。
  • 如果你使用 console.log(req.params.title) 你会得到什么?
  • 奇怪,我无法在路由功能中使用 console.log。
【解决方案2】:

查询字符串参数和路由参数是有区别的。

当您提交表单时,通常它将请求编码为 application/x-www-form-urlencoded (More info here),然后快速路由器解析这些值并通过查询哈希提供它们。有关如何正确使用 express 上的路由参数的更多信息,请转到 here 并阅读路由参数部分。

【讨论】:

    猜你喜欢
    • 2012-04-01
    • 2011-01-16
    • 2014-03-05
    • 2015-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多