【问题标题】:SystemJs not working with windows authentication and typescript in angular4SystemJs 不能在 angular4 中使用 Windows 身份验证和打字稿
【发布时间】:2017-04-29 14:01:01
【问题描述】:

我目前正在尝试使用 Windows 身份验证运行 Angular 4 应用程序。我让它通过匿名身份验证成功运行,但不是 Windows 身份验证。一旦我将其切换到 Windows 身份验证,页面就会失败。我得到的第一个错误是:

(index):38 Error: Fetch error: 401 Unauthorized
  Instantiating http://localhost:1264/app/main.js
  Loading app
    at http://localhost:1264/node_modules/systemjs/dist/system.src.js:1500:13 [<root>]
    at Zone.run (http://localhost:1264/node_modules/zone.js/dist/zone.js:125:43) [<root> => <root>]
    at http://localhost:1264/node_modules/zone.js/dist/zone.js:760:57 [<root>]
    at Zone.runTask (http://localhost:1264/node_modules/zone.js/dist/zone.js:165:47) [<root> => <root>]
    at drainMicroTaskQueue (http://localhost:1264/node_modules/zone.js/dist/zone.js:593:35) [<root>]
    at <anonymous> [<root>]

恶心。但我有点理解。 main.js 正在由 SystemJs 在 Systemjs.config.js 文件的 packages 部分中加载:

    packages: {
  app: {
    main: './main.js',
    defaultExtension: 'js'
  },

所以问题与此有关。我在某处读到,为了解决这个问题,我必须添加更多属性,如下所示:

packages: {
      app: {
        main: './main.js',
        defaultExtension: 'js',
        format: 'register',
        scriptLoad: true
      },

format 和 scriptLoad 属性似乎让我摆脱了未经授权的标签,但现在我遇到了另一个问题。它现在给我以下错误:

Uncaught Error: Module name "@angular/platform-browser-dynamic" has not been loaded yet for context: _. Use require([])
http://requirejs.org/docs/errors.html#notloaded
    at F (require.js:7) [<root>]
    at Object.m [as require] (require.js:26) [<root>]
    at requirejs (require.js:32) [<root>]
    at :1264/app/main.js:2:34 [<root>]

再一次,我有点明白发生了什么。它正在尝试执行 main.js 文件,但该文件包含“require”语句。此时,SystemJs 上下文似乎没有识别出 requirejs 已加载。我的索引文件中有一个脚本语句。

main.ts 看起来像这样:

import {platformBrowserDynamic} from '@angular/platform-browser-dynamic';
import { AppModule } from './app.module';

// ***4***
platformBrowserDynamic().bootstrapModule(AppModule);

转译成这个:

"use strict";
var platform_browser_dynamic_1 = require("@angular/platform-browser-dynamic");
var app_module_1 = require("./app.module");
// ***4***
platform_browser_dynamic_1.platformBrowserDynamic().bootstrapModule(app_module_1.AppModule);
//# sourceMappingURL=main.js.map

它正在对 require 语句进行轰炸。

好的,那为什么它首先使用 require 呢?那是因为 typescript json 文件中的模块语句。在该文件中,模块属性设置为 commonjs。我尝试过其他模块类型,但我得到了 401 未经授权的任何东西,而不是 commonjs,这包括使用系统。

{
  "compilerOptions": {
    "target": "es5",
    "module": "commonjs",
    "moduleResolution": "node",
    "sourceMap": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "removeComments": false,
    "noImplicitAny": false,
    "suppressImplicitAnyIndexErrors": true,
    "typeRoots": [
      "./node_modules/@types/"
    ]
  },
  "compileOnSave": true,
  "exclude": [
    "node_modules/*",
    "**/*-aot.ts"
  ]
}

我已将我的应用程序放在 bitbucket 上,以防有人感兴趣。该应用是在 Visual Studio 2017 Enterprise 中构建的,可在此处找到:Angular2VS2015(正在进行中,因此命名不当)

那么问题来了,如何让应用在 windows 身份验证的上下文中运行?

【问题讨论】:

  • 好吧,我发现 SystemJs 使用 XHR 来执行它的加载,这意味着我可能需要添加授权标头。 SystemJs 有一个授权标签,但我已将其设置为 true,但它仍然无法正常工作。

标签: angular typescript requirejs windows-authentication systemjs


【解决方案1】:

好的,我已经解决了这个问题。问题在于 SystemJ。当 SystemJs 调用服务器以检索包含的文件时,它会进行 XHR 调用。这与从 javascript 调用 webapi 服务没有什么不同 - 如果您未通过身份验证,它将失败并返回 401 Unauthorized。

要解决这个问题,您需要确保在 SystemJs 调用中包含授权标头。这是通过在 System.Config 中添加元标记并将授权属性设置为 true 来完成的。这是我完整的 systemjs.config.js 文件,顶部的元标记使授权工作。

/**
 * System configuration for Angular samples
 * Adjust as necessary for your application needs.
 */
(function (global) {
    System.config({
        meta: {
            '*': { authorization: true }
        },
        paths: {
            // paths serve as alias
            'npm:': 'node_modules/'
        },
        // map tells the System loader where to look for things
        map: {
            // our app is within the app folder
            app: 'app',

            // angular bundles
            '@angular/core': 'npm:@angular/core/bundles/core.umd.js',
            '@angular/common': 'npm:@angular/common/bundles/common.umd.js',
            '@angular/compiler': 'npm:@angular/compiler/bundles/compiler.umd.js',
            '@angular/platform-browser': 'npm:@angular/platform-browser/bundles/platform-browser.umd.js',
            '@angular/platform-browser-dynamic': 'npm:@angular/platform-browser-dynamic/bundles/platform-browser-dynamic.umd.js',
            '@angular/http': 'npm:@angular/http/bundles/http.umd.js',
            '@angular/router': 'npm:@angular/router/bundles/router.umd.js',
            '@angular/forms': 'npm:@angular/forms/bundles/forms.umd.js',
            '@angular/upgrade': 'npm:@angular/upgrade/bundles/upgrade.umd.js',

            // other libraries
            'rxjs': 'npm:rxjs',
            'angular-in-memory-web-api': 'npm:angular-in-memory-web-api/bundles/in-memory-web-api.umd.js',
            'ej-angular2': 'npm:ej-angular2'
        },
        // packages tells the System loader how to load when no filename and/or no extension
        packages: {
            app: {
                main: './main.js',
                defaultExtension: 'js'
            },
            rxjs: {
                defaultExtension: 'js'
            },
            'ej-angular2': {
                main: './src/index.js'
            }
        }
    });
})(this);

我希望这对其他人有所帮助,因为这是一个错误的解决方案。

【讨论】:

  • 我在写这篇文章后发现,当你的应用程序开始变得有点大时,使用 System Loader 会出现问题。请求的文件太多了。你确实需要转移到 webpack 来引入这些文件的捆绑。最好的入门方法是现在在 Dot Net Core 2.0 SDK 中使用 Visual Studio 的 Angular 模板,因为它提供了一个开箱即用的工作应用程序。您需要安装 Dot Net Core 2.0 框架,可在此处找到:microsoft.com/net/download/core
  • 你给我省了这么多麻烦。谢谢。
  • 最新的是visual studio中的angular模板正在发生变化。在创建模板时,还没有 angular cli。 Angular cli 现在是事实上的标准,所以下一个模板将支持 angular cli。当使用 Visual Studio 启动一个新的 Angular 应用程序时,你最好去 JavaScript 服务网站下载新的基于 cli 的模板(现在是一个候选版本)并从它开始。
猜你喜欢
  • 2021-12-18
  • 2017-10-14
  • 2016-08-19
  • 2018-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多