Uncaught Ошибка: Reference.push не удалось: первый аргумент содержит NaN в свойстве - PullRequest
0 голосов
/ 24 апреля 2018

Получение этой ошибки при попытке добавить расход в базу данных firebase:

Uncaught Error: Reference.push failed: first argument contains NaN in property 'users.mzsNqPucvWZMWuyo4sThlMqyR1k2.expenses.km'

в Validation.js и Reaction-dom.development.js

Получение предупреждения о пожаре.

FIREBASE WARNING: set at /users/mzsNqPucvWZMWuyo4sThlMqyR1k2/expenses/-LAsp1j0HVUP-1Y32UMd failed: permission_denied

И затем обещание отлавливает запрещенное разрешение, хотя я установил для правил .read и .write значение true в правилах firebase.

Uncaught (in promise) Error: PERMISSION_DENIED: Permission denied
    at Repo.js:527

Фрагменты кода, которые могут помочь. До сих пор не знаю, как избавиться от запрещенного разрешения.

Правила пожарной базы для справки:

"rules": {
    ".read": true,
    ".write": true,
      "users": {
        "$user_id": {
          ".read": "$user_id === auth.uid",
          ".write": "$user_id === auth.uid",
            "expenses": {
              "$expense_id": {
                ".validate": "newData.hasChildren(['title', 'amount', 'details', 'createdAt', 'category', 'km'])",
                  "title": {
                    ".validate": "newData.isString() && newData.val().length > 0"
                  },
                  "amount": {
                    ".validate": "newData.isNumber()"
                  },

Действие по добавлению расходов (прирост)

const {
            title = '',
            details = '',
            amount = 0,
            createdAt = 0,
            category = '',
            km = 0
        } = expenseData;
        const expense = { title, details, amount, createdAt, category, km };
        database.ref(`users/${uid}/expenses`).push(expense).then((ref) => {
            dispatch(addExpense({
                id: ref.key,
                ...expense
            }));
        });

Я получаю эту ошибку при отправке формы, поэтому я включу ее.

Добавить Exp

export class AddExp extends React.Component {
    onSubmit = (expense) => {
        this.props.startAddExp(expense);
        this.props.history.push('/');
    };
    render() {
        return (
        <div>
            <div>
                <ExpenseForm 
                path={this.props.location.pathname}
                onSubmit={this.onSubmit}/>
            </div>
        </div>
        )
    }
}

Форма расходов onSubmit ()

onSubmit = (e) => {
    e.preventDefault();
    if (!this.state.title || !this.state.amount) {
        this.setState(() => ({ error: 'Error'}))
    } else {
        this.setState(() => ({ error: 'error' }));
        this.props.onSubmit({
            title: this.state.title,
            amount: parseFloat(this.state.amount, 10) * 100,
            createdAt: this.state.createdAt.valueOf(),
            details: this.state.details,
            category: this.state.category,
            km: parseFloat(this.state.km, 10) * 100
        });
    }
   };

Я не думаю, что это связано с кодом, похоже, что firebase предотвращает вставку.

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Если правила проверки не пройдены, они все равно возвращают ошибку PERMISSION DENIED. Я бы дважды проверил ваши правила проверки, чтобы убедиться, что они охватывают крайние случаи, например, когда title равно '' (не удается, поскольку newData.val().length равно 0, а не > 0). Вы уже проверили это в своем ответе, удалив правила проверки (, которые не каскадируются ). Не стесняйтесь публиковать остальные свои правила и примеры того, что терпит неудачу и почему это не должно.

0 голосов
/ 24 апреля 2018

Ошибка исчезла, когда я изменил правила в firebase на чтение и запись.

{
  "rules": {
    ".read": true,
    ".write": true,
  }
}

Но я все еще не понимаю, что не так с моим предыдущим набором правил, но пока это будет работать.

...