Javascript CORS阻塞';访问控制允许原点';不允许使用Firebase函数

Javascript CORS阻塞';访问控制允许原点';不允许使用Firebase函数,javascript,firebase,cors,grand-central-dispatch,Javascript,Firebase,Cors,Grand Central Dispatch,将数据发送到firebase数据库时出错: CORS策略已阻止在“”处从源“”获取的访问:对飞行前请求的响应未通过访问控制检查:请求的资源上不存在“访问控制允许源”标头。如果不透明响应满足您的需要,请将请求的模式设置为“no cors”,以获取禁用cors的资源 部署到firebase后,使用cors更改端点时,我遇到了这个问题。但是,在本地主机上运行时,只有一个错误。我需要它在localhost上工作,因为我仍在使用它进行开发 首先,我运行:npm安装firebase管理cors--save

将数据发送到
firebase
数据库时出错:

CORS策略已阻止在“”处从源“”获取的访问:对飞行前请求的响应未通过访问控制检查:请求的资源上不存在“访问控制允许源”标头。如果不透明响应满足您的需要,请将请求的模式设置为“no cors”,以获取禁用cors的资源

部署到
firebase
后,使用
cors
更改端点时,我遇到了这个问题。但是,在本地主机上运行时,只有一个错误。我需要它在localhost上工作,因为我仍在使用它进行开发

首先,我运行:
npm安装firebase管理cors--save

这是我在文件夹
firebase
函数上的package.json

{
  "name": "functions",
  "description": "Cloud Functions for Firebase",
  "scripts": {
    "lint": "eslint .",
    "serve": "firebase serve --only functions",
    "shell": "firebase functions:shell",
    "start": "npm run shell",
    "deploy": "firebase deploy --only functions",
    "logs": "firebase functions:log"
  },
  "engines": {
    "node": "8"
  },
  "dependencies": {
    "cors": "^2.8.5",
    "firebase-admin": "^8.9.1",
    "firebase-functions": "^3.3.0"
  },
  "devDependencies": {
    "eslint": "^5.12.0",
    "eslint-plugin-promise": "^4.0.1",
    "firebase-functions-test": "^0.1.6"
  },
  "private": true
}


下面是index.js文件我需要cors模块:

var functions = require('firebase-functions');
var admin = require('firebase-admin');
const cors = require('cors')({origin: true});


exports.storePostData = functions.https.onRequest(function(request, response) {
 return cors(function(request, response) {

    admin.database().ref('posts').push({
        id: request.body.id,
        title: request.body.title,
        location: request.body.location,
        image: request.body.image
    })
        .then(function() {
            return response.status(201).json({message: 'Data stored', id:request.body.id});
        })
        .catch(function(err) {
           return response.status(500).json({error: err});
        });
 });
});

下面是我的sw.js函数,它使用了
firebase
函数,但不起作用:

self.addEventListener('sync', function(event) {
  console.log('[Service Worker] Background syncing', event);
  if (event.tag === 'sync-new-posts') {
    console.log('[Service Worker] Syncing new Posts');
    event.waitUntil(
      readAllData('sync-posts')
        .then(function(data) {
          for (var dt of data) {
            fetch('https://myFirebaseFUnctionLink/storePostData', {
              method: 'POST',
              headers: {
                'Content-Type': 'application/json',
                'Accept': 'application/json'
              },
              body: JSON.stringify({
                id: dt.id,
                title: dt.title,
                location: dt.location,
                image: 'https://myfirebaselink/'
              })
            })
              .then(function(res) {
                console.log('Sent data', res);
                if (res.ok) {
                  deleteItemFromData('sync-posts', dt.id); // Isn't working correctly!
                }
              })
              .catch(function(err) {
                console.log('Error while sending data', err);
              });
          }

        })
    );
  }
});

当我使用普通的firebase数据库链接
.json
进行更改时,其工作正常

此错误发生在
firebase
功能中:

TypeError: Cannot read property 'origin' of undefined
    at /srv/node_modules/cors/lib/index.js:219:40
    at optionsCallback (/srv/node_modules/cors/lib/index.js:199:9)
    at corsMiddleware (/srv/node_modules/cors/lib/index.js:204:7)
    at /srv/index.js:9:9
    at cloudFunction (/srv/node_modules/firebase-functions/lib/providers/https.js:49:9)
    at /worker/worker.js:783:7
    at /worker/worker.js:766:11
    at _combinedTickCallback (internal/process/next_tick.js:132:7)
    at process._tickDomainCallback (internal/process/next_tick.js:219:9)

我也有同样的问题。关键是cors方法的语法。它有3个参数:req、res和一个函数

返回cors(请求、恢复、功能(){
管理
.数据库()
.ref(“职位”)
.推送(要求主体)
.然后(函数(){
返回res.status(201.json)({
消息:“数据已存储”,
id:req.body.id,
});
})
.catch(函数(err){
返回res.status(500).json({
错误:呃,
});
});
});我也有同样的问题,
您必须进入“functions”文件夹中的“.eslintrc.json”,并注释或删除此行:

"promise/always-return": 2,
在此之后,您不必总是添加return-in-then块,因此删除return关键字,如下所示:

const functions = require('firebase-functions');
const admin = require('firebase-admin');
const cors = require('cors')({ origin: true });

// // Create and Deploy Your First Cloud Functions
// // https://firebase.google.com/docs/functions/write-firebase-functions
//
const serviceAccount = require('./serviceAccountKey.json');

admin.initializeApp({
    credential: admin.credential.cert(serviceAccount),
    databaseURL: 'https://you-project-addres.firebaseio.com/',
});

exports.storePostData = functions.https.onRequest((request, response) => {
    return cors(request, response, () => {
        admin
            .database()
            .ref('posts')
            .push({
                id: request.body.id,
                title: request.body.id,
                location: request.body.location,
                image: request.body.image,
            })
            .then(() => {
                response.status(201).json({ message: 'Data stored', id: request.body.id });
            })
            .catch((err) => {
                response.status(500).json({ error: err });
            });
    });
});

可能的重复-这仍然不起作用,很抱歉,在我的项目中,我使用了
constcors=require('cors')({origin:*”,credentials:true,methods:“GET”})它对我有效我应该在哪里使用
constcors=require('cors')({origin:*”,credentials:true,methods:'GET})
?您应该在index.js开始时添加此要求,您怎么会认为这是linter的问题,或者OP甚至在其
.eslintrc.json
文件中有此项?