12 Stimmen

Undefined|0|Referenzfehler: Strict-Modus verbietet die implizite Erstellung der globalen Eigenschaft 'csrf_token'

Also, dies war ein ziemlich interessantes Problem, dem ich begegnet bin.

Ich baue derzeit eine Backbone.js - Rails-App. Im Grunde baue ich dies nur zu Lernzwecken. Ich bemühe mich (wie jeder gute Rails-Entwickler) nach bestem Wissen und Gewissen um TDD/BDD und bin auf ein Problem mit Capybara gestoßen.

Ich habe eine Integrationsspezifikation, die lediglich den root_path testet (Backbone-History startet, anfängliche Informationen anzeigt, usw...).

require 'spec_helper'

describe "RentalProperties", js: true do
  describe "GET /" do
    it "sollte eine Liste der Eigenschaften zeigen" do
      visit root_path
      eventually{page.should have_content("Etwas")}
    end
  end
end

Ich führe Tests mit Jasmine, Sinon und Capybara/RSpec/Webkit durch. Ich folge locker sowohl dem Buch "Rspec on Rails" von thoughtbot (übrigens ein tolles Buch) als auch diesem Tutorial: http://tinnedfruit.com/2011/03/03/testing-backbone-apps-with-jasmine-sinon.html.

Als ich die obige Spezifikation ausführte, stieß ich auf diesen Fehler:

undefined|0|ReferenceError: Der Strict-Modus verbietet die implizite Erstellung der globalen Eigenschaft 'csrf_token'

Ich habe lange gebraucht, um dies zu lösen, weil es wirklich nichts zu diesem Fehler bei Google gibt.

Schließlich stieß ich auf die Verwendung von "use strict" in JS. Im Wesentlichen werden dadurch einige neue EMCA5-Skriptkonventionen verwendet. Es werden mehr Kodierfehler erkannt und verhindert, dass auf globale Variablen zugegriffen wird. Alles gute Dinge.

Also überprüfe ich, und in meiner sinon.js-Datei sehe ich:

"use strict";

auf Zeile 36 der Datei. Wie sich herausstellte, kommentierte ich diese Zeile aus und meine Tests funktionierten einwandfrei.

Hier ist meine Frage: Warum hat "use strict" csrf durcheinander gebracht? Ich gehe davon aus, dass dies etwas mit csrf_meta_tags in meinem Rails-Layout zu tun hat. Wenn möglich, würde ich gerne diese Zeile wieder in die Sinon-JS einfügen, da ich annehme, dass dies das "richtige" ist.

Hat jemand weitere Informationen dazu? Ich wäre im Voraus für alle Details dankbar!!

23voto

RobG Punkte 133037

Es wird Ihnen mitgeteilt, dass einem nicht deklarierten Variablen namens csrf_token ein Wert zugewiesen wird, z. B.

csrf_token = 'foo';

Im nicht-stricten Modus wird dadurch eine Eigenschaft des globalen Objekts erstellt (normalerweise als globale Variable bezeichnet) mit dem Namen csrf_token, wenn diese Codezeile ausgeführt wird.

Im stricten Modus wird der Fehler ausgelöst, den Sie sehen, weil der strenge Modus die implizite Erstellung globaler Variablen verhindert. Sie könnten es auch beheben, indem Sie Folgendes einschließen:

var csrf_token;

irgendwo in einem globalen Kontext im gleichen Skriptelement wie der Code, von dem der Fehler stammt, oder in einem vorherigen Skriptelement.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X