Firebase 即使I';已在服务器上设置访问控制允许源站

Firebase 即使I';已在服务器上设置访问控制允许源站,firebase,cors,google-cloud-functions,Firebase,Cors,Google Cloud Functions,在localhost上运行react应用程序时,我在浏览器上遇到以下错误,该应用程序将有效负载发送到Google Firebase函数: CORS策略已阻止从源“”在“https://.cloudfunctions.net/”获取的访问:请求的资源上不存在“访问控制允许源”标头。如果不透明响应满足您的需要,请将请求的模式设置为“no cors”,以获取禁用cors的资源 我的Google Firebase函数具有以下代码: exports.<myfunction> = functio

在localhost上运行react应用程序时,我在浏览器上遇到以下错误,该应用程序将有效负载发送到Google Firebase函数:

CORS策略已阻止从源“”在“https://.cloudfunctions.net/”获取的访问:请求的资源上不存在“访问控制允许源”标头。如果不透明响应满足您的需要,请将请求的模式设置为“no cors”,以获取禁用cors的资源

我的Google Firebase函数具有以下代码:

exports.<myfunction> = functions.https.onRequest(async (req, res) => {

  res.set('Access-Control-Allow-Origin', 'http://localhost:3000');
  res.set('Access-Control-Allow-Headers', '*');

  console.log(req.body); 

  res.end()
});
导出functions.https.onRequest(异步(请求、回复)=>{
res.set('Access-Control-Allow-Origin','http://localhost:3000');
res.set('Access-Control-Allow-Headers','*');
控制台日志(请求主体);
决议结束()
});
我在firebase函数控制台日志中发现的错误如下:

submit(name) {

    fetch('https://< myproject >.cloudfunctions.net/< my function >', {method: 'POST', headers: {"Content-Type": "application/json", 
      },
      body: 'mytoken'
    }).then(result => {console.log(result)}); 
  }
SyntaxError:JSON中位置0处的意外标记# 在JSON.parse()处 在createStrictSyntaxError(/worker/node_modules/body parser/lib/types/json.js:157:10) 在解析时(/worker/node_modules/body parser/lib/types/json.js:83:15) at/worker/node_modules/body parser/lib/read.js:121:18 在invokeCallback(/worker/node_modules/raw body/index.js:224:16) 完成时(/worker/node_modules/raw body/index.js:213:7) 在IncomingMessage.onEnd(/worker/node_modules/raw body/index.js:273:7) 在emitNone(events.js:111:20) 在IncomingMessage.emit(events.js:208:7) 在endReadableNT(_stream_readable.js:1064:12)

触发函数的客户端代码如下所示:

submit(name) {

    fetch('https://< myproject >.cloudfunctions.net/< my function >', {method: 'POST', headers: {"Content-Type": "application/json", 
      },
      body: 'mytoken'
    }).then(result => {console.log(result)}); 
  }
submit(名称){
fetch('https://.cloudfunctions.net/,{method:'POST',头:{“Content Type”:“application/json”,
},
正文:“mytoken”
}).then(result=>{console.log(result)});
}

而且,就在几分钟和几天前,一切都很好!这就好像这个错误不知从哪里冒出来似的

您的获取请求正在发送一个
application/json
的内容类型头,但是主体是
'mytoken'
,它不是有效的json。尝试发送类似于
{“token”:“mytoken”}
的内容

编辑:此外,由于您正在设置内容类型标题,因此可能会触发CORS飞行前选项请求,并且可能希望使用来处理该请求

编辑2:错误的来源实际上是发送了一个普通字符串而不是JSON对象(由于内容类型设置为application/JSON,所以需要一个JSON对象)。然而,还有一个额外的bug,JSON负载需要字符串化。因此,“body”的以下代码使一切都成功运行:

body: JSON.stringify({token: 'mytoken'})

你在服务器端使用
node
吗?@DonaldWu我使用的是使用Nodeu的googlefirebase函数use
express
?您是否在节点中添加了
cors
lib@DonaldWu据我所知,除非firebase函数以某种方式自动使用express,否则我不会使用express,但我不认为这是您不使用标准cors模块的任何原因?谢谢你抓住了!但是,仍然无法解决CORS问题。如果出现JSON解析错误,甚至无法访问您的代码。您的函数日志现在打印出了什么?我将主体更改为主体:{'token':'mytoken'}。奇怪的是,我在服务器日志上得到了两组响应:函数执行开始正文:{}函数执行花了111毫秒,完成状态代码:200函数执行开始函数执行花了60毫秒,完成状态代码:400 SyntaxError:JSON中位于JSON.pars位置1的意外标记o由于您正在设置
内容类型
标题,您可能正在触发CORS预飞行。我建议使用上面有人建议的方法来正确处理
选项
请求。我认为这可能是您目前出现问题的原因。使用JSON对象现在可以工作了,但我需要在对象上使用JSON.stringify()。