为什么在NodeJS POST请求后我的网页会刷新?

时间:2018-07-23 23:53:40

标签: javascript node.js express fetch axios

我正在使用带有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子进程,则我的客户端网页会获取数据且不会刷新。

4 个答案:

答案 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进行热重载。