Подтвердить что ты не робот

Undefined | 0 | ReferenceError: Строгий режим запрещает неявное создание глобального свойства 'csrf_token'

Итак, это была довольно интересная проблема, с которой я столкнулся.

В настоящее время я создаю приложение backbone.js - Rails. Как правило, это делается для обучения. Я (как и любой хороший рельс dev) прилагаю все усилия в TDD/BDD, и у меня возникла проблема с capybara.

У меня есть спецификация интеграции, которая просто проверяет работу root_path (начинается история базы данных, отображает начальную информацию и т.д.).

require 'spec_helper'

describe "RentalProperties", js: true do
  describe "GET /" do
    it "should show a list of properties" do
      visit root_path
      eventually{page.should have_content("Something")}
    end
  end
end

Я запускаю тесты с жасмином, синоном и capybara/rspec/webkit. Я свободно слежу за книгой "Rspec on Rails" от мыслителя (кстати, замечательная книга), и этот урок: http://tinnedfruit.com/2011/03/03/testing-backbone-apps-with-jasmine-sinon.html.

При запуске указанной спецификации я наткнулся на эту ошибку:

undefined|0|ReferenceError: Strict mode forbids implicit creation of global property 'csrf_token'

Я долгое время разбирался в этом, потому что на эту ошибку действительно ничего не было.

В конце концов я наткнулся на использование "строгого режима" в JS. По сути, это будет использовать некоторые новые соглашения EMCA5 script. Он будет захватывать больше кодирования bloopers и не позволит вам получить доступ к глобальным переменным. Все хорошие вещи.

Итак, я проверяю, и в моем файле sinon.js я вижу:

"use strict";

в строке 36 файла. Lo и вот я прокомментирую строку, и мои тесты работают очень хорошо.

Вот мой вопрос: зачем использовать строгий беспорядок csrf? Я предполагаю, что это имеет какое-то отношение к csrf_meta_tags в моем рельсовом макете. Если возможно, я хотел бы вернуть эту строку в синус js, поскольку я предполагаю, что это "правильная вещь"

Есть ли у кого больше информации об этом? Я ценю любые детали заранее!

4b9b3361

Ответ 1

Сообщает вам, что значение присваивается переменной с именем csrf_token, которая не была объявлена, например.

csrf_token = 'foo';

В нестрогом режиме это создаст свойство глобального объекта (обычно называемого глобальной переменной), называемого csrf_token, когда выполняется эта строка кода.

В строгом режиме он выдает ошибку, которую вы видите, потому что строгий режим предотвращает неявное создание глобальных переменных. Вы также можете исправить это, включив:

var csrf_token;

в любом месте глобального контекста в том же элементе script, что и код ошибки, или предыдущий элемент script.