javascript - 在 Node JS 和 Express 中使用 POST 将查询参数发送到另一个页面
问题描述
这是我面临的问题:
我有多个连续的网页,我在查询参数中持有相同的 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 是下一个
解决方案
我明白你现在的意思了。您发布表单的 url 在 URL 中包含一个查询参数。那是您无法访问的参数。好吧 - 该参数不在 POST 参数中,它不在表单中。所以你有2个选择。
- 当您使用
/third
GET 请求输出视图时,您应该将该查询参数作为隐藏输入值添加到表单中,以便您可以将其作为参数发布到后端。
如果您使用的是 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 字段。这是一个常见的解决方案,但要注意的一件事是验证您的查询参数,因为现在您允许人们将值随机传递到您的页面上 - 这将被回发,您永远无法确定人们不会传递一些恶意值在那边。
- 另一种方法——我不推荐,但这是一种方法——是查看标题。因为您当前的解决方案没有隐藏的表单字段 - 您可以查看引荐来源标头,并且您缺少的查询参数会在那里。
你可以做一个
console.log(req.headers.referer);
在您/third
看来,它应该具有完整的先前 URL,其中还包含您要查找的参数。
推荐阅读
- html - 如何为嵌套的多 div 设置单独的样式?
- kubernetes - 为什么 kubectl cp 命令以退出代码 126 终止?
- javascript - 我需要使用 fetch 为数组中的每个图像添加图像元素到 DOM
- java - Google Cloud Platform Debugger for Compute Engine with Payara/Glassfish 应用服务器
- python - Django form.save(commit=False) 不添加 user_id
- python - 用于嵌套字典的 Python 表格
- typescript - 我可以将对象的现有属性“重新绑定”到打字稿中的另一种类型吗?
- google-compute-engine - 如何使用 NAT 将私有 IP 地址映射到 GCP 中的公共 IP
- python - python-socketio 如何坚持会话
- angular - 角度多可观察守卫不按顺序运行