【问题标题】:URLs requested via Http on the server must be absolute. URL: ./assets/i18n/en.json服务器上通过 Http 请求的 URL 必须是绝对的。网址:./assets/i18n/en.json
【发布时间】:2017-06-17 16:12:31
【问题描述】:

我是 Angular 2 的新手,我在 ngx-translate 组件中有以下问题(通过服务器上的 Http 请求的 URL 必须是绝对的。URL:./assets/i18n/en.json)。我确信这个 en.json 文件在我向它发出 http 请求并且请求成功时就在那里

这是我的 app.module.server.ts 文件:

import { NgModule } from '@angular/core';
import { ServerModule } from '@angular/platform-server';
import { sharedConfig } from './app.module.shared';
import { HttpModule, Http } from '@angular/http';
import {
    TranslateModule,
    TranslateLoader,
    MissingTranslationHandler,
    MissingTranslationHandlerParams
} from '@ngx-translate/core';
import { TranslateHttpLoader } from '@ngx-translate/http-loader';

export function createTranslateLoader(http: Http) {
    return new TranslateHttpLoader(http, './assets/i18n/', '.json');
}

export class MyMissingTranslationHandler implements MissingTranslationHandler {
    handle(params: MissingTranslationHandlerParams) {
        return '[' + params.key + ']';
    }
}

@NgModule({
    bootstrap: sharedConfig.bootstrap,
    declarations: sharedConfig.declarations,
    imports: [
        ServerModule,
        HttpModule,
        TranslateModule.forRoot({
            loader: {
                provide: TranslateLoader,
                useFactory: (createTranslateLoader),
                deps: [Http]
            }
        }),
        ...sharedConfig.imports
    ]
})
export class AppModule {
}

这是我的 app.module.cleint.ts 文件:

import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { FormsModule } from '@angular/forms';
import { HttpModule,Http } from '@angular/http';
import { sharedConfig } from './app.module.shared';
import {
    TranslateModule,
    TranslateLoader,
    MissingTranslationHandler,
    MissingTranslationHandlerParams
} from '@ngx-translate/core';
import { TranslateHttpLoader } from '@ngx-translate/http-loader';
export function createTranslateLoader(http: Http) {
    return new TranslateHttpLoader(http, './assets/i18n/', '.json');
}

export class MyMissingTranslationHandler implements MissingTranslationHandler {
    handle(params: MissingTranslationHandlerParams) {
        return '[' + params.key + ']';
    }
}

@NgModule({
    bootstrap: sharedConfig.bootstrap,
    declarations: sharedConfig.declarations,
    imports: [
        BrowserModule,
        FormsModule,
        HttpModule,
        TranslateModule.forRoot({
            loader: {
                provide: TranslateLoader,
                useFactory: (createTranslateLoader),
                deps: [Http]
            }
        }),
        ...sharedConfig.imports
    ],
    providers: [
        { provide: 'ORIGIN_URL', useValue: location.origin },
        {
            provide: MissingTranslationHandler,
            useClass: MyMissingTranslationHandler
        }
    ]
})
export class AppModule {
}

这是我的 app.module.shared.ts 文件:

import { NgModule } from '@angular/core';
import { RouterModule } from '@angular/router';
import { HttpModule, Http } from "@angular/http";
import { BrowserModule } from "@angular/platform-browser";

import { TranslateModule} from '@ngx-translate/core';

import { AppComponent } from './components/app/app.component'
import { NavMenuComponent } from './components/navmenu/navmenu.component';
import { HomeComponent } from './components/home/home.component';
import { FetchDataComponent } from './components/fetchdata/fetchdata.component';
import { EmployeesListComponent } from './components/employees/EmployeesList.component';
import { CounterComponent } from './components/counter/counter.component';

export const sharedConfig: NgModule = {
    bootstrap: [AppComponent],
    declarations: [
        AppComponent,
        NavMenuComponent,
        CounterComponent,
        FetchDataComponent,
        EmployeesListComponent,
        HomeComponent
    ],
    imports: [
        RouterModule.forRoot([
            { path: '', redirectTo: 'home', pathMatch: 'full' },
            { path: 'home', component: HomeComponent },
            { path: 'counter', component: CounterComponent },
            { path: 'fetch-data', component: FetchDataComponent },
            { path: 'employees-list', component: EmployeesListComponent },
            { path: '**', redirectTo: 'home' }
        ]),
        BrowserModule,
        HttpModule,TranslateModule
    ]
    , exports: [
        TranslateModule
    ]
};

【问题讨论】:

标签: angular ngx-translate


【解决方案1】:

问题就是这样。 ./assets/i18n/en.json 不是绝对网址,例如:http://foo.com/assets/i18n/en.json。我知道通常有一些方法可以表明您从与客户端代码相同的服务器提供服务。不会吧

export function createTranslateLoader(http: Http) {
    return new TranslateHttpLoader(http, '/assets/i18n/', '.json');
}

但是当我在 angular docs repos 中四处寻找时:我看到了这个:https://github.com/angular/angular/issues/15349。因此,也许角度 http 服务不支持调用提供文档的主机。这有点令人惊讶,但你可以在 javascript 中使用:

window.location.origin

因此,只需在设置通话时将其添加到 /assets/i18n/ 即可。

【讨论】:

  • 是的,先生,文件在那里,当我向文件发出 http 请求时(localhost:15199/assets/i18n/en.json),我得到了响应,并按照他们网站上的 ngx-translate 示例“createTranslateLoader”
  • 所以如果你改变应该很好 return new TranslateHttpLoader(http, './assets/i18n/', '.json');返回新的 TranslateHttpLoader(http, '/assets/i18n/', '.json');只需去掉资产前面的句点即可。
  • 我也试过了,但是没用,报同样的错误:(服务器上通过Http请求的URL必须是绝对的。URL:/assets/i18n/en.json)
  • @Mohammad 你找到解决方案了吗?
  • 他是说直接放,加isPlatformBrowser wrap,收工。
猜你喜欢
  • 2018-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-03
  • 1970-01-01
  • 2014-09-22
  • 2016-10-18
  • 1970-01-01
相关资源
最近更新 更多