2016-12-30 54 views
2

我正在构建一个Angular2通用应用程序,并正在整合ng2-translate在Angular Universal应用程序中获取ExpressJS的头衔

服务器端我需要知道用户的语言,我可以从ExpressJS通过request.acceptsLanguages()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,我的服务器架设ng2-translate

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

回答

2

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

首先,确保打字稿解析器不破,你也需要申报,在文件的顶部,你正在使用Zone

declare var Zone: any; 

或者我猜你可以安装所有类型,但我没有测试过。

然后,在节点的任何地方只有模块,你可以通过这样得到的server.ts文件传递给res.render参数:

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

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

req.headers['user-agent']; 

更新ANGULAR 5

正如评论中指出的那样,以前的代码不再适用。好消息是,随着角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'] 
} 
+0

这并不在新角5 –

+0

@kris_IV感谢指点出来工作。我已经用适用于Angular 5的代码更新了答案:-) – ghego1

+0

我在SSR Angular 5的Zone上遇到问题。它仅适用于浏览器模式下的我。我为我的问题描述了复杂的解决方案:https://stackoverflow.com/a/48509431/2972087 –

相关问题