在Angular Universal应用程序中获取ExpressJS的vaues

时间:2016-12-30 11:58:06

标签: node.js angular express angular2-universal

我正在构建一个Angular2 Universal应用,并且我正在整合ng2-translate

服务器端我需要知道用户的语言,我可以通过request.acceptsLanguages()ExpressJS)从see docs获取该语言。

我在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的{​​{1}}中传递或访问它们。

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

1 个答案:

答案 0 :(得分:3)

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

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

declare var Zone: any;

或者我猜你可以安装所有的打字机,但我还没有测试过。

然后,只有节点中的任何模块,您可以通过这样做获取res.render文件中传递给server.ts的参数:

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

最后,您可以访问req中传递给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']
}