【问题标题】:Angular ngCookies $cookie is undefinedAngular ngCookies $cookie 未定义
【发布时间】:2016-09-29 19:01:00
【问题描述】:

我正在开发一个 Django-Angular 应用程序,并且需要使 csrf 令牌出现在所有 Angular AJAX 发布或放置请求中。我正在使用 ngCookies,但是当我尝试将 cookie csrf 令牌分配给所有有角度的帖子标题时,它给了我一个错误:

TypeError: Cannot read property 'csrftoken' of undefined

$cookieStore 也未定义,并且在 $cookies 上使用 get 方法也不起作用。我正在为 angular-cookies 加载正确的脚本,它与我的 angular 版本相匹配,并且我没有收到关于 ngCookies 本身的任何错误,所以我不确定它可能是什么?

(function () {
    'use strict';

Config.$inject = ["$locationProvider", "$stateProvider", "$urlRouterProvider", "$httpProvider"];
angular
    .module('app.guest', [
        'app.common',
        'app.core',
        'app.repo',
        'ui.bootstrap',
        'ngCookies'
    ])
    .config(Config);
    .run(['$cookies'], function ($rootScope, $http, $cookies) {
            // set the CSRF token here
            $http.defaults.headers.post['X-CSRFToken'] = $cookies.csrftoken;
        })

/** ngInject */
function Config($locationProvider, $stateProvider, $urlRouterProvider, $httpProvider, $cookies) {

    broadcastReady.$inject = ["CommonService", "CommonEvents"];
    $locationProvider.html5Mode(true);
    $httpProvider.defaults.xsrfCookieName = 'csrftoken';
    $httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken';
    $httpProvider.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
    $httpProvider.defaults.headers.post['X-CSRFToken'] = $cookies.csrftoken;

控制台

vendor.js:12275 Uncaught Error: [$injector:modulerr] Failed to instantiate module app.guest due to:
TypeError: Cannot read property 'csrftoken' of undefined

【问题讨论】:

    标签: angularjs django post csrf


    【解决方案1】:

    $inject 列表末尾添加"$cookies"

    Config.$inject = ["$locationProvider", "$stateProvider", "$urlRouterProvider", "$httpProvider", "$cookies"];
    

    确保你也加载了angular-cookies.js

    【讨论】:

    • 这似乎不起作用。我猜你不能将服务注入到模块配置中,你必须将它注入到模块运行块中。即使这样做了,它仍然显示为未定义。
    • 啊,我没有意识到您在 config() 中运行它,而您要做的是将 X-CSRFToken 添加到您的 POST 标头中。在这种情况下,设置xsrfCookeNamexsrfHeaderName 就足够了,您不需要在headers.post 中显式设置cookie
    • Ahhhh 所以当我设置 $httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken';已经将 cookie 值设置为任何帖子标题?
    • 我知道我做了什么,我猜你用括号表示法注入的服务必须匹配传递给函数的服务参数。由于 run 有 $rootscope 和 $http,但它们没有被传递到注入器中,因此 run 块甚至没有考虑 $cookie。
    • 是的,在您的 config() 中设置 xsrfCookieNamexsrfHeaderName 应该会自动执行此操作。无需在headers.post中显式设置。
    猜你喜欢
    • 2015-11-18
    • 2015-06-26
    • 2019-03-23
    • 1970-01-01
    • 1970-01-01
    • 2017-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多