【发布时间】: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