Abo*_*ara 2 javascript php cors vue.js
在这里,我的代码遇到了一个小问题。
我在后端(端口8000)上有一个laravel应用程序,在其中创建了一个CORS中间件,该中间件使我能够从前端(端口8080)上进行跨源请求
这是我的中间件
<?php
namespace App\Http\Middleware;
use Closure;
class Cors
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
return $next($request)
->header('Access-Control-Allow-Origin', env("CORS_DOMAINS", 'http://localhost:8080'))
->header('Access-Control-Allow-Methods', 'OPTIONS,POST,GET ,PUT, PATCH, DELETE')
->header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-type, Authorization', 'Accept-Language','Content-Disposition', 'Accept');
}
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,如果我使用vue-resource进行简单的请求,一切都会很好。但是,当我将formData作为数据传递时,CORS失败。
我创建了一个Javascript类来上传文件
在接下来的几行中,只有这一行引起我们的兴趣(发出XHR请求的人):
return this.vm.$http.post(this.options.url, this.data)
Run Code Online (Sandbox Code Playgroud)
class Upload {
defaultOptions = {
extensions: null,
maxSize: null,
multiple: false,
inputName: 'file'
}
errors = []
constructor (files, Vue, options) {
this.files = files
this.vm = Vue
this.options = Object.assign(this.defaultOptions, options)
this.data = new FormData()
return this.upload()
}
upload () {
if (!this.files.length) return
for (let i = 0; i < this.files.length; i++) {
if (this.checkFile(this.files[i])) {
this.pushToData(this.files[i])
} else {
this.errors.forEach((error) => this.options.errorsCallback(error))
}
}
for (let key in this.options.params) {
if (this.options.params.hasOwnProperty(key)) { this.data.append(key, this.options.params[key]) }
}
return this.vm.$http.post(this.options.url, this.data)
}
checkFile (file) {
return this.checkSize(file) && this.checkExtensions(file)
}
checkSize (file) {
if (this.options.maxSize && file.size > this.options.maxSize) {
this.errors.push('The file `' + file.name + '` size must not exceed' + this.options.maxSize)
return false
}
return true
}
checkExtensions (file) {
if (this.options.extensions && !this.options.extensions.includes(file.type.split('/')[1])) {
this.errors.push('The file `' + file.name + '` must have one of theses extensions :' + this.options.extensions.join(','))
return false
}
return true
}
pushToData (file) {
this.data.append(this.options.inputName, file)
}
}
export default Upload
Run Code Online (Sandbox Code Playgroud)
我希望在发送formData时查询成功
我收到一条消息,说缺少Access-Control-Allow-Origin标头,但是在我的Cors中允许使用此标头。我不明白这个错误。

在这里,CORS不是真正的问题,您的中间件工作正常。直接在上方看,您会注意到之前的错误提示500 (Internal Server Error)
当您的服务器抛出500错误时,Chrome偶尔会认为这是CORS问题。修复500错误,CORS问题将消失。
迟到了这里的聚会,但只是想与其他可能有相同经历的人分享我的回应。
我有一个 Nginx API 网关,我发现网关上的服务器块中有一个 max body size 参数,因此这导致了 CORS 错误(每当我上传导致请求结束的文件时那个限制)。
我不确定这到底是什么导致错误显示为 CORS 错误,但这是我的来源......希望它也可以帮助其他人!