【问题标题】:Getting response object Nodejs Express获取响应对象 Nodejs Express
【发布时间】:2018-07-02 00:57:56
【问题描述】:


我有一个使用 nodejs 和 express 运行的网络应用程序。我使用 ejs 作为视图引擎。
这是我的 ejs 文件:

    <!DICTYPE html>
<html lang="en">

<head>
    <title>Nodejs Mongodb App</title>

    <style>
    </style>
</head>
<ul>
    <li><span>Title: </span> <div><%= movie.title %></div> </li>
    <li><span>From Year: </span> <div><%= movie.fromYear %></div> </li>
    <li><span>To Year: </span> <div><%= movie.toYear %></div> </li>
    <li><span>Genre: </span> <div><%= movie.genre %></div> </li>
    <li><span>Director: </span> <div><%= movie.genre %></div> </li>
    <li><span>Creator: </span> <div><%= movie.genre %></div> </li>
    <li><span>Number of Episodes: </span> <div><%= movie.genre %></div> </li>
    <li><span>Number of Seasons: </span> <div><%= movie.genre %></div> </li>
    <li><span>Poster URL: </span> <div><%= movie.genre %></div> </li>
    <li><span>Plot: </span> <div><%= movie.plot %></div> </li>


</ul>

<button><a href="/delete" style="text-decoration: none">Delete Record</a></button>

<body>

<script>
console.log(movie);
</script>
</body>
</html>

这是我的路线:

 app.post('/find', function (req, res, next) {
        var collection = db.collection('movies');
        collection.find({title: req.body.title}).toArray(function (err, result) {
            console.log(result[0]);
            res.render('movie.ejs', {movie: result[0]});
        });

    });

调用 /find 的表单:

<form action="/find" method="post">
    <input type="text" placeholder="title to search" name="title">
    <button type="submit">Search</button>
</form>

我希望能够获取从路由发送的“电影”并将其存储在客户端的对象中。我该怎么做? 目标:我想将电影 ID 发送回服务器,以便在单击删除按钮时将其删除。



更新 1 我正在按标题搜索电影,但是当我想删除它时,我想使用 ID。所以我需要的是解析响应体。但是如何?

【问题讨论】:

    标签: node.js express ejs


    【解决方案1】:

    尝试将其作为 JSON 字符串传递给客户端,然后创建一个变量将其解析为 JSON。


    服务器

    res.render('movie.ejs', {
        movie: result[0],
        moviejson: JSON.stringify(result[0])
    });
    

    客户

    <script>
        var movie_object = JSON.parse('<%= moviejson %>');
        console.log(movie_object);
    </script>
    

    【讨论】:

      【解决方案2】:

      你实际上可以在这里做的是:

      1) 根据电影标题制作可用于渲染页面的路线。

      2)创建一个新的路由,它实际上作为 rest api 端点(用于获取电影详细信息),您可以向该端点发出 ajax 请求并获取电影的详细信息。

      你的节点代码:

      app.get('/movie-render-page/:title', function (req, res, next) {
         res.render('movie.ejs');
      });
      
      app.get('/movie/:title', function(req,res,next){
           var collection = db.collection('movies');
          collection.find({title: req.params.title}).toArray(function (err, result) {
              res.status.send(result);
          });
      
      });
      

      您的 html 代码:

      <script>
           //call '/movie/:title' and you can than bind data to html and use it 
      </script>
      

      【讨论】:

      • 我在帖子中添加了调用路由 /find 的部分。所以你说我应该调用 /movie/:title 而不是 /find?但是如何在客户端将搜索输入值作为“标题”提供给路由?
      • @Miss.Code 我说的是rest api,您可以对/movie/:title api进行ajax调用并在您的javascript中获取列表。你可以使用 javascript dom 操作函数将它添加到 dom。
      【解决方案3】:
      1. 您显示的路线是POST,它应该是GET,用于在浏览器中显示您的电影数据。
      2. 我假设您正在为数据存储中的每条记录分配某种 ID?你需要把它放在页面的某个地方。
      3. 您的按钮必须位于模板中的&lt;form&gt; 中。
      4. 您需要将JSPOST 的电影 ID 返回到您的应用程序中处理删除的 POST 路由(假设您要使用 AJAX,否则只需在表单中将方法设置为 POST 并设置操作网址正确)。
      5. 或使用http DELETE请求将id传递给服务器(更安静的方式)来处理删除。

      【讨论】:

      • 我在帖子中放的路由是渲染页面的路由,而不是删除的路由。
      • POST 不用于渲染,也不应该是您用来渲染页面的路由。该路由应该是GET,您需要一个POST 路由才能删除。
      • 但我必须将表单数据作为 POST 发送。我应该将用户重定向到另一个路径以便我可以使用 GET 或其他方式吗?
      • 我不会在这里做任何假设,但是您是否了解GETPOST 之间的区别以及它们在客户端和服务器端的关系?听起来你让他们感到困惑。服务器上的GET 路由旨在处理来自客户端的GET 请求(渲染页面)。服务器上的POST 路由用于处理来自客户端的POST 请求(在本例中为删除记录)。您需要 both 一个 app.get 来将页面初始呈现给浏览器,并需要一个 app.post 来处理来自浏览器的表单提交。这清楚吗?
      • 我当然知道区别! :|是的。我两个都需要。
      猜你喜欢
      • 2015-03-29
      • 2022-01-11
      • 2020-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多