【问题标题】:Sending query params forth to another page with POST in Node JS and Express在 Node JS 和 Express 中使用 POST 将查询参数发送到另一个页面
【发布时间】:2018-12-15 20:50:38
【问题描述】:

这是我面临的问题:

我有多个连续的网页,我在查询参数中持有相同的 id,并由于各种原因将其从一个发送到下一个。使用 GET 路由传递此参数时一切正常。但是,第三页(也有查询参数)有一个简短的表单和 POST 方法,它在最后重定向到第四页。像这样的:

app.post("/third", function(req, res){
   req.body.id //returns undefined, but should not

   some code here

   res.redirect("/fourth?id="+id); //how i want to pass the param on
});

无论我使用哪个,req.body 或 req.query 或 req.params,我都无法从

访问 id 'abcd'
web-app/third?id=abcd

并将其添加到第四页查询参数,我总是得到未定义。

我做错了吗?对于 Node JS 和 Express 以及与 web 应用程序有关的一切仍然很新,所以我的逻辑可能是错误的。我搜索过谷歌,但由于我缺乏经验,大多数帖子对我没有帮助。当我有一个 POST 方法并且除了保存表单查询本身的页面之外无法从任何地方访问参数时,如何发送参数?

感谢任何帮助!

编辑:

前端的样子:

<form action="/third" method="post">
...
a few inputs here 
....
<input type="submit" rel="next" value="To signing" class="button" 
id="nextbutton">                        
<a onclick="setUrl();" rel="prev" class="button" id="cancelbutton">Previous page</a>
</form>

/third 是当前页面,/fourth 是下一个

【问题讨论】:

  • 你能从你的前端发布你的发帖方式吗?
  • 按照你的要求更新了主帖
  • 还有 id 输入,你有没有机会把它也添加到代码中?
  • 那么 /web-app/ 是不同的子路由还是只是 localhost 的替代品?
  • id 不是此页面上的输入,它是从查询参数中第三个之前的页面接收的。就像我写的:由于各种原因,我在查询参数中持有相同的 id 并从一个发送到下一个。目前它是 localhost 的替代品。

标签: javascript node.js express web-applications


【解决方案1】:

我现在明白你的意思了。您发布表单的 url 在 URL 中包含一个查询参数。那是您无法访问的参数。好吧 - 该参数不在 POST 参数中,它不在表单中。所以你有两个选择。

  1. 当您使用 GET 请求输出 /third 视图时,您应该将该查询参数作为隐藏输入值添加到表单中,以便您可以将其作为参数发布到后端。

如果您使用的是 Node.js,您只需修改您的 /third 视图(可能是 Jade / Pug 模板) 拥有

// Make sure this line is in the form that you're posting (syntax is jade - any other way of replacing the idFromServer value with a server value would work just as well.
input(name="id", type="hidden", value="#{idFromServer}")

并将您的视图渲染代码更新为:

// It's read from query because we know this one is a get request.
res.render('third', {idFromServer: req.query.id});

在此之后req.body.id 应该可以工作了! 我们在这里所做的是,每当您获得带有 id 参数的第三个视图时,我们将在表单中放置一个隐藏的 POST 请求字段。 当您发布时,您可以访问您的 id 变量,因为您的表单有一个带有值的 id 字段。这是一个常见的解决方案,但要注意的一件事是验证您的查询参数,因为现在您允许人们将值随机传递到您的页面上 - 这将被回发,您永远无法确定人们不会传递一些恶意值那边。

  1. 执行此操作的另一种方法(我不推荐但这是一种方法)是查看标题。因为您当前的解决方案没有隐藏的表单字段 - 您可以查看 referrer 标头并且您缺少的查询参数将在那里。

你可以做一个

console.log(req.headers.referer);

在您的/third 视图中,它应该具有完整的先前 URL,其中还包含您要查找的参数。

【讨论】:

  • 只是出于兴趣,为什么不推荐第二种选择?
  • 这是一个糟糕的设计 - 除了可以从另一个站点发布到该端点的任何人(如果启用了 CORS)/另一个桌面客户端可能会破坏您的引荐来源标头 - 给您一个完全出乎意料的价值。想象一下,您希望看到您的 domain.id/id=123 并且您收到 randomsite.net/x=mavi :)
  • 第一个选项效果很好,为像我这样的初学者解释清楚,非常感谢!
  • :) 谢谢 - 祝 NodeJs 好运!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-31
  • 2020-04-07
  • 1970-01-01
  • 2018-05-26
  • 2018-12-10
  • 2018-02-10
相关资源
最近更新 更多