我正在使用带有NodeJS的express框架。客户端发出POST请求时,它将一些工作推到python脚本中,然后将JSON对象返回到客户端网页。
我的问题是,只要我的POST请求完成,客户端就会刷新。我已经使用Axios和Fetch http客户端进行了测试。 在发出这样的POST请求时,如何防止网页刷新?
服务器代码类似于:
app.post("/data/", function(req, res) {
const spawn = require("child_process").spawn;
const pythonProcess = spawn('python', ["my_script.py"]);
pythonProcess.stdout.on('data', (data) => {
let result = data.toString();
res.send(JSON.stringify(result));
});
});
然后我从我的React客户端发出一个请求(使用Axios,但Fetch的行为方式相同):
axios({
method: 'post',
url: `http://localhost:3001/videos/?url=${url}`,
responseType: 'json',
});
客户端网页刷新...
我知道React不应该受到指责,因为没有什么可以更新应用程序状态。即使我对服务器的响应不执行任何操作,在POST完成后网页仍会刷新。
此外,我的网页上没有表单元素或类似的内容,并且我的button
的类型为button
,而不是类型的submit
。
我预感这与python进程本身的调用方式有关,因为如果我仅返回一个纯JSON对象而不调用python子进程,则我的客户端网页会获取数据且不会刷新。
答案 0 :(得分:2)
如果您基于从<form>
收集的数据来进行nodeJS发布-在用户单击type = submit按钮之后,则问题在于表单的Submit按钮的本机HTML行为是刷新页面。
解决此问题的方法是-在您的表单onsubmit上,也许是该handleSubmit函数上的onSubmit={handleSubmit}
,让它接受一个事件,然后随便调用它即可。然后在其他任何代码之前执行event.preventDefault()。像这样:
handleSubmit(e){
e.preventDefault();
// the rest of your code, post call ,etc
}
答案 1 :(得分:0)
我在 ReactJS 客户端 axios.post 中遇到了这个问题。我最初忽略了这个承诺,但是在添加了 .then() 之后,问题就消失了。但是我不知道如何添加 .then() 解决问题
答案 2 :(得分:-1)
我认为,您需要对响应标头进行更改,即响应类型为json类型。
var headers = {};
headers["Content-Type"] = 'application/json';
res.writeHead(200, headers);
app.options('/*', function (req, res) {
var headers = {};
// set header to handle the CORS
headers['Access-Control-Allow-Origin'] = '*';
//headers['Access-Control-Allow-Origin'] = 'http://localhost:?';
headers['Access-Control-Allow-Headers'] = 'Content-Type, Content-Length, Authorization, Accept, X-Requested-With';
headers['Access-Contrl-Allow-Methods'] = 'PUT, POST, GET, DELETE, OPTIONS';
headers["Access-Control-Max-Age"] = '86400';
headers["Content-Type"] = 'application/json';
res.writeHead(200, headers);
res.end();
});
我不知道python语法,但是应该可以。
答案 3 :(得分:-1)
我知道了。我的python过程的一部分是将文件写入React的public
文件夹,这显然导致React进行热重载。