2016-12-30 93 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 –

相關問題