Javascript connect modrewrite将我的POST请求更改为GET
我需要重定向一个POST请求,为了演示这个问题,我已经设置了2个nodejs服务器。一个提供一些HTML并进行修改,另一个在修改后接收帖子。第一个提供HTML并进行重写的程序如下所示:Javascript connect modrewrite将我的POST请求更改为GET,javascript,node.js,proxy,connect-modrewrite,Javascript,Node.js,Proxy,Connect Modrewrite,我需要重定向一个POST请求,为了演示这个问题,我已经设置了2个nodejs服务器。一个提供一些HTML并进行修改,另一个在修改后接收帖子。第一个提供HTML并进行重写的程序如下所示: var connect = require('connect'); var cors = require('cors'); const modRewrite = require('connect-modrewrite') var http = require('http'); const { nextTick
var connect = require('connect');
var cors = require('cors');
const modRewrite = require('connect-modrewrite')
var http = require('http');
const { nextTick } = require('process');
var app = connect();
app.use(cors())
app.use('/test', function(req, res, next){
res.end(`
<!doctype html><html><body>
<button type="button"class="yes">click</button>
<script>
async function postData (url = '', data = {}) {
const response = await fetch(url, {
method: 'POST',
mode: 'cors',
cache: 'no-cache',
credentials: 'same-origin',
headers: {
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'DELETE, POST, GET, OPTIONS'
},
redirect: 'follow', // manual, *follow, error
referrerPolicy: 'no-referrer', // no-referrer, *client
body: JSON.stringify(data)
})
return await response.json();
}
document.querySelector('.yes').addEventListener('click', () => {
postData('http://localhost:3000/a/b', { answer: 42 }).then(data => {
console.log(data);
});
});
</script></body></html>`);
});
app.use(function(req, res, next){
console.log('RECEIVED', req.method);
next();
});
app.use(modRewrite([
'^/(.*)$ http://localhost:4001/$1 [R, L]'
])
);
http.createServer(app).listen(3000);
因此,流程如下所示:
1) In the browser I do a fetch/POST
2) It is received as POST and connect-modrewrite is applied
3) My second backend prints: RECEIVED /a/b GET
所以我的问题是,为什么我的帖子被转换成GET,我该如何解决这个问题?这是预期的行为。当您执行重定向(301/302)时,POST数据在重定向时被丢弃,因为客户端将对301指定的URL执行GET请求 为了解决这个问题,您应该使用重定向307。请参见以下参考:
1) In the browser I do a fetch/POST
2) It is received as POST and connect-modrewrite is applied
3) My second backend prints: RECEIVED /a/b GET