2017-06-05 40 views
0

我想在服务器端呈现请求时以角度4通用方式获取远程IP地址。我试图让节点请求对象使用zone.js具有以下角度的服务,但没有得到它,在Angular Universal中获取远程地址

var req = Zone.current.get('req') || {}; 
var headers = (req && req.headers) ? req.headers : {}; 
console.log("Zone Headers: " + JSON.stringify(headers)); 

有没有获得IP地址?我想将IP地址传递给API以获取基于位置的结果。

怎么办?请帮忙。

回答

1

你可以通过实体传递从Express服务器到应用的角度,像这样...... 在你server.ts文件(这是贯彻落实express.js服务器),你需要添加一个新的提供者(见'extraProviders')

... 
app.engine('html', (_, options, callback) => { 
    const opts = { 
    document: template 
    ,url: options.req.url 
    ,extraProviders: [ 
         //pass the express.js request object through to the angular4 app 
         { provide: 'request', useFactory:() => options.req } 
        ] 
    }; 

    renderModuleFactory(AppServerModuleNgFactory, opts) 
    .then(html => callback(null, html)); 
}); 
... 

然后在你的角4的应用程序,你可以注入请求对象到您的服务或组件,像这样:

import { Injectable, Injector, PLATFORM_ID } from '@angular/core'; 
import { isPlatformServer } from '@angular/common'; 


@Injectable() 
export class SomeService { 

    constructor(
      private injector: Injector 
     ,@Inject(PLATFORM_ID) private platformId: Object 
     ){ 
     if (isPlatformServer(this.platformId)) { 
      // -> server rendered 
      let requestObj = this.injector.get('request'); 
      let ip = requestObj.connection.remoteAddress; 
     } else { 
      // -> browser rendered 
     } 
    } 
... 

这是我的完整server.ts file:

import 'reflect-metadata'; 
import 'zone.js/dist/zone-node'; 
import { platformServer, renderModuleFactory } from '@angular/platform-server' 
import { enableProdMode } from '@angular/core' 
import { AppServerModuleNgFactory } from '../dist/ngfactory/src/app/app.server.module.ngfactory' 
import * as express from 'express'; 
import { readFileSync } from 'fs'; 
import { join } from 'path'; 
import * as compression from 'compression'; 

const PORT = 4200; 

enableProdMode(); 

const app = express(); 

let template = readFileSync(join(__dirname, '..', 'dist', 'index.html')).toString(); 

app.engine('html', (_, options, callback) => { 
    const opts = { 
    document: template 
    ,url: options.req.url 
    ,extraProviders: [ 
         { provide: 'request', useFactory:() => options.req } 
         ,{ provide: 'host', useFactory:() => options.req.get('host') } 
        ] 
    }; 

    renderModuleFactory(AppServerModuleNgFactory, opts) 
    .then(html => callback(null, html)); 
}); 

app.set('view engine', 'html'); 
app.set('views', 'src'); 
app.use(compression()); 

app.get('*.*', express.static(join(__dirname, '..', 'dist'))); 

app.get('*', (req, res) => { 
    res.render('index', { req }); 
}); 

app.listen(PORT,() => { 
    console.log(`listening on http://localhost:${PORT}!`); 
});