vue.js - 从 Vue 到 Cake 后端的 API 发布在重新加载时失败
问题描述
在重新加载前端、后端、浏览器和/或计算机的某些情况下,从 Vue 到 Cake 后端的 API 发布失败。
我正在开发一个使用 Vue.js 作为前端框架和 CakePHP 3.8 作为后端框架的应用程序。我在 Vue 中设置了一些表单,我从这些表单向多个 Cake Backend Endpoints 发出 POST 请求。我的 GET 请求工作正常..
在某些情况下,我会收到一条错误消息。一旦我删除了一些代码,再试一次,然后放回原始代码并再试一次,这个错误消息就会消失。错误消息说有一个 CORS 块,但它说所有错误,也有拼写错误。所以错误信息完全在这种情况下。因此,使用完全相同的代码,请求在删除、重试和放回之后起作用。
根本原因和解决方案
帮助我找到解决方案的重要一点是意识到控制台给出了错误的错误 (CORS)。CakePHP 中的错误日志更加清晰。这给出了一个错误 Error: [PDOException] SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'name' cannot be null (Cake error.log)。因此写入数据库的数据无法保存到数据库中。错误是在处理 Cake Backend 上的 POST 数据时。
问题的解决方案是在进行保存之前先执行请求数据检查.. if($data){}
***我认为问题与与后端建立第一次连接的时间延迟有关。想要在没有建立数据的情况下立即进行保存。显然这仅在启动系统时发生。***
有人对此有更好的解释吗?
Vue前端代码:
<template>
<div id="addpacklist">
{{post_data}}
<p v-if="errors.length">
<b>Please correct the following error(s):</b>
<ul>
<li v-for="error in errors">{{ error }}</li>
</ul>
</p>
<form v-on:submit.prevent="addPackinglist">
<h2>Add PackingList</h2>
<label for="name">Name:</label>
<input type="text" id="name" v-model="name"><br>
<input type="submit" value="Submit">
</form>
</div>
</template>
<script>
var data = [];
import $ from 'jquery';
// you will use v-model & data on edits..
export default{
name :'addpacklist',
data(){
return{
errors: [],
name: '',
post_data: '',
}
},
methods: {
addPackinglist(){
this.errors = [];
// form validation
if(!this.name){
this.errors.push('Name required.');
}
if (this.name.length > 10){
this.errors.push('Name maximum 10 Characters');
}
if(this.name && this.name.length < 11){
// cannot use associative arrays in Javascript : does not exist!!
data[0] = this.name;
console.log(data);
fetch('http://wampprojects/holidays_backend/packinglists/add', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(data),
})
.then(response => response.json())
.then(json_data => this.post_data = json_data)
.catch(error => {
console.log("error");
});
}
},
},
}
</script>
蛋糕后端代码:
public function add(){
$data = $this->request->data;
$sendback = "";
// build up data object and save to database
$packinglist = $this->Packinglists->newEntity();
// if you do not perform this check you will get an error
// I think it has something to do with establishing the first link from Front-End to Back-End (Session)
// THIS IS WHAT I ADDED TO MAKE IT WORK!!
if($data){
$packinglist->name = $data[0];
// something wrong with saving entity
if($this->Packinglists->save($packinglist)){
$sendback = "save success";
}else{
$sendback = "save failed";
};
}
// no automatic view, only data returned
$this->autoRender = false;
return $this->response
->withType('application/json')
->withStringBody(json_encode($data));
}
我记录了一些场景..
当停止一个元素并保持浏览器打开时..
**当停止并重新启动 Vue 的本地开发服务器时,它仍然有效。(好的)
**当停止和重新启动互联网时仍然有效。(好的)
**当停止和重新启动 wamp 服务器时仍然有效..(好的)
**当停止和启动 wamp 服务器时仍然有效..(好的)
停止一个元素并关闭浏览器时..
**停止 Wamp 并重新启动(ok)
**停止 Wamp 并启动(ok)
**停止 Vue 并重新启动(ok)
**停止 Internet 并重新启动(ok)
停止和(重新)启动 Vue 和 Wamp 并保持浏览器打开时..
**第一次重新启动 Wamp 时,然后 Vue..(好的)
**当第一次启动 Wamp 时,然后 Vue。(ok)
**当第一次用“npm run serve”重启Vue时..然后启动所有服务wamp..(nok)
**当第一次重启Vue..然后重启所有服务wamp..(ok)
停止和(重新)启动 Vue 和 Wamp 并关闭浏览器时..
**首先重新启动 Wamp,然后 Vue,然后浏览器..(nok)
**首先启动 Wamp,然后 Vue,然后浏览器..(ok)
**先启动Vue,再启动Wamp,再启动浏览器(ok)
**先启动Vue,再启动Wamp,再启动浏览器(nok)
关机时
**先启动 Vue,然后 Wamp,然后浏览器(nok)
**先启动 Wamp,然后 Vue,然后浏览器(nok)
解决方案
根本原因和解决方案 帮助我找到解决方案的重要一点是意识到控制台给出了错误的错误 (CORS)。CakePHP 中的错误日志更加清晰。这给出了一个错误错误:[PDOException] SQLSTATE[23000]:完整性约束违规:1048 列“名称”不能为空(Cake error.log)。因此写入数据库的数据无法保存到数据库中。错误是在处理 Cake Backend 上的 POST 数据时。
问题的解决方案是在进行保存之前先执行请求数据检查.. if($data){}
谢谢 -ndm- 的详细解释
产生的错误可以/将(取决于您的 PHP 安装的 output_buffering 设置)立即产生输出,在这种情况下 PHP 不能再发送任何标头,即 CORS 不需要 CORS 相关标头可以发送工作请求。根据确切的错误消息和附加到它的附加上下文(堆栈跟踪等),输出缓冲区可能不会在每个请求上溢出(单个字节已经可以产生差异),因此这种不可靠的行为。
推荐阅读
- pytorch - RuntimeError: 4 维权重 [256, 1, 3, 3] 的预期 4 维输入,但得到了大小为 [64, 1, 786] 的 3 维输入
- macos - MacOS 上的 GridDB Docker
- javascript - Firefox 扩展:如何对内容脚本中的一个 onload 事件做出反应?
- gremlin - Gremlin:获取从顶点离开的边的独特属性
- python - 如何重塑一维减少为1的张量?
- javascript - 无法将元素动态插入 Semantic-UI Accordion
- django - 我们如何在 django 应用程序中获取用户手机和平板电脑的 gps 数据?
- android-studio - 从活动 1 到活动 2 的意图,然后从活动 2 到活动 1 的意图,而不重置列表视图
- mysql - @apollo/federation 和 @apollo/gateway 中的 2 个服务中的查询/突变
- ssl - 需要在 JMeter 中同时使用客户端和服务器端证书来命中 SSL 连接的 POST 请求