4

我正在构建一个 Angular2 Universal 应用程序,并且正在集成ng2-translate

服务器端我需要知道用户的语言,我可以通过(参见文档)从ExpressJS获得。request.acceptsLanguages()

我确实正确地得到了这些值server.ts

function ngApp(req: any, res: any) {
  let supportedLangs = req.acceptsLanguages();
  console.log('supportedLangs', supportedLangs);
  res.render('index', {
    req,
    res,
    ngModule: AppModule,
    preboot: false,
    baseUrl: '/',
    requestUrl: req.originalUrl,
    originUrl: req.hostname
  });
}

然后我不知道如何在我为服务器app.node.module.ts设置的位置传递它们或访问它们。ng2-translate

有没有办法从 Angular Universal 应用程序(服务器端)访问这些值?如何?

4

1 回答 1

5

对于那些感兴趣的人,解决方案是使用Zone,并且在这样做时需要注意一些事项。

首先,为了确保 TypeScript 解析器不会中断,您还需要在您正在使用的文件的顶部声明Zone

declare var Zone: any;

或者我猜你可能会安装所有的类型,但我还没有测试过。

然后,在仅节点模块中的任何位置,您都可以通过执行以下操作获取传递给文件的res.render参数server.ts

let req = Zone.current.get('req');

最后,您可以访问传递给reqin的任何属性server.ts,例如:

req.headers['user-agent'];

角度 5 的更新

正如评论中所指出的,以前的代码不再起作用。好消息是使用 Angular 5 更容易和直接:

import { Injector } from '@angular/core';
import { REQUEST } from '@nguniversal/express-engine/tokens';

constructor(
    private _injector: Injector
) {
    const req = this._injector.get(REQUEST);
    // use as: req.headers['whatever-is-in-the-headers']
}
于 2017-03-13T16:59:57.293 回答