通过nodejs和express来redirect到自定义url

我有一个redirect的问题。 我有一个小的nodejs / express应用程序,应该在提交表单后redirect到具有表单input值的外部URL。

的index.html

<form method="POST" action="https://192.0.2.1/abc.html"> <input name="name"/> <input name="email"/> <button type="submit"> </form> 

只有https://192.0.2.1/abc.html没有input值。 请帮忙。

我写了一个你正在描述的实例:

 'use strict'; var host = '127.0.0.1', port = 3333; var express = require('express'); var bodyParser = require('body-parser'); var app = express(); app.use(bodyParser.urlencoded({extended: true})); app.get('/', (req, res) => { res.type('html').end(` <form method="POST" action="http://${host}:${port}/abc.html"> <input name="name"/> <input name="email"/> <button type="submit">Submit</button> </form> <form method="POST" action="http://${host}:${port}/def.html"> <input name="name"/> <input name="email"/> <button type="submit">Submit</button> </form> `); }); app.post('/abc.html', (req, res) => { var name = req.body.name, email = req.body.email; res.redirect(`http://${host}:${port}/ghi.html?name=${name}&email=${email}`); }); app.post('/def.html', (req, res) => { res.type('html').end(` <p>Name: ${req.body.name}</p> <p>Email: ${req.body.email}</p> `); }); app.get('/ghi.html', (req, res) => { res.type('html').end(` <p>Name: ${req.query.name}</p> <p>Email: ${req.query.email}</p> `); }); app.listen(port, () => console.log(`Listening on http://${host}:${port}/`)); 

运行

你需要安装expressbody-parser

 npm install express body-parser 

并运行:

 node app.js 

两种forms

第一种forms通过POST方法正确传递参数。 POST /abc.html处理程序可以访问它们,并将redirect发送到以下格式的自定义URL: /ghi.html?name=xxx&email=yyy – redirect的目标以HTML格式显示这些值,您可以在地址栏也是如此。

第二种forms不会redirect,而是直接显示参数,这样您就可以更好地看到发生了什么。 在浏览器中打开开发者控制台并在单击表单button时观察networking活动也很有用。

说明

从你的例子中不完全清楚你的代码中有什么可能是错误的,但是我希望向你展示一个可用的代码示例将帮助你诊断你的实现中的问题。

你必须记住的是,对于在查询string中传递参数的GET请求,你可以像下面这样访问它们:

 req.query.name req.query.email 

对于在请求体中传递参数的POST请求,您必须使用body-parser中间件,然后可以通过以下方式访问它们:

 req.body.name req.body.email 

请求概述

这里发生的请求是:

  1. 您访问http://127.0.0.1:3333/并获得两种forms的HTML
  2. 您input电子邮件aaa作为电子邮件的名称和bbb ,然后提交第一个表单
  3. 您的浏览器将POST请求发送到/abc.html/abc.html包含name=aaa&email=bbb
  4. 服务器发送一个302 Found响应与Location: http://127.0.0.1:3333/ghi.html?name=aaa&email=bbb标题
  5. 您的浏览器将GET请求发送到: /ghi.html?name=aaa&email=bbb
  6. 服务器发送包含参数的HTML 200 OK响应