【问题标题】:Firebase 3.0 throws cross-origin error when bundled with webpackFirebase 3.0 与 webpack 捆绑时抛出跨域错误
【发布时间】:2016-05-23 23:29:42
【问题描述】:

我遇到了 Firebase 3.0.3 的问题,它会引发以下错误:

FIREBASE WARNING: Exception was thrown by user callback. Error: Blocked a frame with origin "https://localhost:3000" from accessing a cross-origin frame.
at Error (native)
at derez (<anonymous>:995:515)
at derez (<anonymous>:1001:208)
at derez (<anonymous>:1001:208)
at derez (<anonymous>:1001:208)
at derez (<anonymous>:1001:208)
at derez (<anonymous>:1001:208)
at derez (<anonymous>:1001:208)
at derez (<anonymous>:1001:208)
at derez (<anonymous>:1001:208) 

Uncaught SecurityError: Blocked a frame with origin "https://localhost:3000" from accessing a frame with origin "https://falkor.firebaseapp.com". Protocols, domains, and ports must match.

我的堆栈使用 React 15.1.0、Redux 3.5.2、Babel-Core 6.9.0 和 webpack 1.13.1。

以下是重要部分:

// ./src/constants/index.js

import * as firebase from 'firebase';
firebase.initializeApp(JSON.parse(process.env.FIREBASE_CONFIG));

export const ref = firebase.database().ref();
export const auth = firebase.auth();




// ./src/actions/auth.js

import * as actions from './';
import { ref, auth } from '../constants';

export const loadAuth = () =>
  (dispatch, getState) => {
    const { subscribed } = getState().firebase;
    if (subscribed.indexOf('auth') < 0) {
      dispatch(actions.fbaseSubscribed('auth'));
      auth.onAuthStateChanged(user => {
        if (user) {
          dispatch(loadMe(user.uid));
          dispatch(actions.auth(user));
        }
      });
    }
  };

const serialize = data => ({ [data.key]: data.val() });

export const loadMe = (uid) =>
  (dispatch, getStore) => {
    const { subscribed } = getStore().firebase;
    if (subscribed.indexOf('me') < 0) {
      dispatch(actions.fbaseSubscribed('me'));
      const item = ref.child('teamMembers').child(uid);

      item.on('child_added',   data => dispatch(actions.me(serialize(data))));
      item.on('child_changed', data => dispatch(actions.me(serialize(data))));
      item.on('child_removed', data => dispatch(actions.me(serialize(data))));
    }
  };

export const login = ({email, password}) =>
  () => {
    auth.signInWithEmailAndPassword(email, password).catch(err => console.error(err));
  };

export const renewSession = token =>
  () => {
    auth.signInWithCustomToken(token).catch(err => console.error(err));
  };

当我尝试quickstart app 时,我没有遇到任何关于在页面头部初始化的 firebase 配置的问题。我只在使用 NPM 安装模块并将其与 webpack 捆绑时遇到此问题。

任何帮助将不胜感激,我已经摸索了几个小时了。

【问题讨论】:

  • 我在同一个堆栈上也有同样的问题,而且快速启动应用程序也不会重现问题
  • 我只是意识到使用我的应用程序的 dist 版本不会发生错误。似乎是 webpack-devserver 导致了问题
  • 好像和webpack-dev-middleware有关
  • 我在运行 dist 代码时遇到了同样的问题,所以我不认为这是 webpack-server 的问题
  • 我发现在我的代码中有一个错误,我试图调度一个将用户作为参数传递的操作,但是用户,如果我从操作中删除用户,我没有收到错误。当firebase promise的“then”语句中发生另一个错误时,似乎会发生错误。解决它即使使用身份验证也对我有用。

标签: javascript reactjs firebase webpack babeljs


【解决方案1】:

我没有看到您的完整代码,但由于它对我有用,请尽量不要对整个用户发送操作

export const loadAuth = () =>
  (dispatch, getState) => {
    const { subscribed } = getState().firebase;
    if (subscribed.indexOf('auth') < 0) {
      dispatch(actions.fbaseSubscribed('auth'));
      auth.onAuthStateChanged(user => {
        if (user) {
          dispatch(loadMe(user.uid));
          //dispatch(actions.auth(user)); // not dispatch the entire user. When I changed this my code worked
          dispatch(actions.auth(user.email));
        }
      });
    }
  };

更新 1

我做了这个简单的转换函数来解析来自 Firebase 用户对象的数据:https://gist.github.com/douglascorrea/003ae6a6b11f19c97d6ee5b28d0d9eef

此外,如果您想了解有关此问题的更多信息,可以在 Firebase 组中关注此线程:https://groups.google.com/d/msg/firebase-talk/Lp6I9uS0PAo/AbHwr_03DwAJ

更新 2 我用 React Redux 创建了一个 Firebase 3.0 启动器。

你可以看看:Firebase 3.0 starter with React Redux


【讨论】:

  • 我在星期四发现了同样的事情,并打算为它写一个答案。不过还是谢谢你!我现在提取 uid、refreshToken、photoUrl 并将它们发送到我的减速器,错误就消失了。似乎减速器不喜欢用户对象中的某些内容并且不会存储它。但就像你在另一条评论中所说的那样,错误来自具有误导性的承诺。
【解决方案2】:

这里只是猜测,但是使用 ES6 的 import 语句,你应该使用:

import * as firebase from 'firebase';

当使用 ES5 require() 时:

var firebase = require('firebase');

请注意,Firebase npm 包中同时包含浏览器和节点版本(分别参见“浏览器”和“主”入口点)。

确保您已安装最新的 Firebase (3.0.3) - 早期版本在我们在 Browserify/WebPack 中导出 firebase 命名空间的方式中存在错误。

【讨论】:

  • 我使用的是 firebase 3.0.2,我已经更新到 3.0.3 并将我的导入更改为 import * as firebase from 'firebase' 并且遇到了同样的问题。我会看看我是否可以组合一个小示例应用程序来重现相同的内容并在此处链接到它。
  • 谢谢 - 我尝试使用 webpack 复制它,我的代码运行良好 - 所以我在这里遗漏了一些区别。
  • 我正在使用 3.0.3 并使用了 import * 并且仍然会发生。当我构建项目并使用 express 服务时,它不会发生。好像和webpack-dev-server或者webpack-dev-middleware有关
  • @mckoss 我刚刚从我的应用程序中删除了身份验证并将我的规则更改为不需要身份验证,我不再收到错误。很抱歉仍在为您处理另一个应用程序,只需要抽出时间来完成它。希望这有帮助吗?
  • @AJW 感谢您对 webpack-dev-server 的提示。我认为正在发生的事情是它正在加载 node.js firebase 代码,并将其提供给浏览器。我们的 package.json 有两个不同的入口点,具体取决于您使用的环境:“main”:“firebase-node.js”、“browser”:“firebase-browser.js”、
猜你喜欢
  • 2020-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-24
  • 2012-04-03
  • 2020-04-27
  • 2020-02-08
  • 2019-08-16
相关资源
最近更新 更多