使用Node JS和Express中的POST将查询参数发送到另一个页面

时间:2018-12-15 20:50:38

标签: javascript node.js express web-applications

这是我面临的问题

我有多个连续的网页,其中由于各种原因,我在查询参数中保留相同的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应用程序相关的一切,它还是一个新事物,因此我的逻辑可能不对。我已经搜索过Google,但是由于经验不足,大多数帖子对我都没有帮助。当我有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>

/第三是当前页面,/第四是下一页

2 个答案:

答案 0 :(得分:0)

您将要使用req.query.id来从your-url.localhost/third?id=value获取价值。

res.redirect("/fourth?id=" + req.query.id);应该可以工作。

文档在这里: http://expressjs.com/en/api.html#req.query

答案 1 :(得分:0)

我明白你的意思了。您要发布表单的网址中的URL中包含一个查询参数。这是您无法访问的参数。好吧-该参数不在POST参数中,也不在表单中。因此,您有2个选择。

  1. 在通过GET请求输出/third视图时,应将该查询参数作为隐藏的输入值添加到表单中,以便可以将其作为参数发布到后端。
  2. li>

如果您使用的是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请求字段。 POST时,您可以访问id变量,因为您的表单具有一个带值的id字段。这是一种常见的解决方案,但是要注意的一件事是验证查询参数,因为现在您允许人们将值随机传递到您的页面上-这将被回发,您永远无法确保人们不会传递一些恶意值那边。

  1. 执行此操作的另一种方法(我不建议这样做,但这是一种方法)是查看标题。由于您当前的解决方案没有隐藏的表单字段-您可以查看referrer标头,然后就会缺少查询参数。

您可以进行

console.log(req.headers.referer);

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