Javascript 为什么我的网页在NodeJS POST请求后刷新?
我正在使用带有NodeJS的express框架。当客户端发出POST请求时,它将一些工作推送到python脚本,然后将JSON对象返回到客户端网页 我的问题是,每当我的POST请求完成时,客户端就会刷新。我已经用Axios和Fetch http客户端进行了测试在发出这样的发帖请求时,如何防止网页刷新? 服务器代码如下所示:Javascript 为什么我的网页在NodeJS POST请求后刷新?,javascript,node.js,express,fetch,axios,Javascript,Node.js,Express,Fetch,Axios,我正在使用带有NodeJS的express框架。当客户端发出POST请求时,它将一些工作推送到python脚本,然后将JSON对象返回到客户端网页 我的问题是,每当我的POST请求完成时,客户端就会刷新。我已经用Axios和Fetch http客户端进行了测试在发出这样的发帖请求时,如何防止网页刷新? 服务器代码如下所示: app.post("/data/", function(req, res) { const spawn = require("child_process").sp
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的行为与此相同):
客户端网页将刷新
我知道React不应该受到责备,因为没有任何东西在更新应用程序状态。即使我对服务器的响应不做任何处理,当帖子完成时,网页仍然会刷新
此外,我的网页上没有表单元素或类似的内容,我的按钮
是按钮
类型,而不是提交
类型
我有一种预感,这与python进程本身的调用方式有关,因为如果我只返回一个简单的JSON对象而不调用python子进程,我的客户机网页将获取数据,并且不会刷新。我认为,您需要更改响应头,即响应类型为JSON类型
var头={};
标题[“内容类型”]=“应用程序/json”;
文件标题(200,标题);
应用程序选项(“/*”,函数(请求,恢复){
var头={};
//设置标题以处理CORS
标题['Access-Control-Allow-Origin']='*';
//标题['Access-Control-Allow-Origin']='http://localhost:?';
headers['Access-Control-Allow-headers']='Content-Type、Content-Length、Authorization、Accept、X-request-With';
标题['Access-controll-Allow-Methods']=“PUT、POST、GET、DELETE、OPTIONS”;
标题[“访问控制最大年龄”]=“86400”;
标题[“内容类型”]=“应用程序/json”;
文件标题(200,标题);
res.end();
});代码>我想出来了。我的python过程的一部分是将文件写入React的public
文件夹,这显然会导致React进行热重新加载。如果您正在根据从
收集的数据进行nodeJS发布,则在用户单击类型为提交的按钮后,然后问题是表单提交按钮的本机HTML行为是进行页面刷新
解决这个问题的方法是——在您的表单onsubmit中,可能是onsubmit={handleSubmit}
在handleSubmit函数上,让它接受一个事件,调用它。然后在任何其他代码之前执行event.preventDefault()。像这样:
handleSubmit(e){
e.preventDefault();
// the rest of your code, post call ,etc
}
表单上按钮的默认操作是提交,因此您可能需要在按钮处理程序中防止提交。我试过了。我真的认为这是服务器端的问题。但为了以防万一,我尝试添加了preventDefault
之类的内容。很幸运,这不太可能是服务器端的问题-服务器无法控制这样的浏览器,特别是在AJAX请求中-在浏览器开发工具控制台中发生了什么?很有趣。。。现在我得到“发送到客户端后无法设置头”。这就好像express正在设置头并在从python子流程到达回调之前发送它们。请尝试在前面添加头:res.send(JSON.stringify(result));他们以前是。同样的问题。我猜报头在应该发送之前的某个时间点被发送回客户机,然后在调用回调时,它会将数据发送回客户机。由于它们是延迟,因此客户端刷新。但我仍然不知道为什么我会收到标题消息…你能不能也添加一个“选项”请求。我已经编辑了我的答案。因为他们的答案是延迟,客户端刷新。
-这是一个非常奇怪的声明这是我的问题,而不是其他答案中提到的type='button',挽救了我的一天
handleSubmit(e){
e.preventDefault();
// the rest of your code, post call ,etc
}