在SSR期间获取主机名

时间:2018-01-26 15:41:26

标签: reactjs typescript asp.net-core-2.0 serverside-rendering

我正在编写一个应用程序,它在不同的域中有一个客户端和一个api,如下所示:

[本地]

localhost:5000(客户端)

localhost:5001(api)

[网络]

app.domain.com(客户端)

api.domain.com(api)

现在,在编写我的获取请求时,我希望能够在我从localhost客户端发出请求时向localhost api发送请求,并在Web客户端请求时发送web api。要做到这一点,我必须能够设置我的基本网址,所以我正在尝试编写一个getApiDomain方法,我可以使用它来选择正确的域。

let fetchTask = fetch(`${Domain.getApiDomain()}/api/Item/${id}`)...

我的方法如下:

export abstract class Domain {
    public static isLocalhost = Boolean(window.location.hostname === 'localhost' );

    public static getApiDomain(): string {

        return this.isLocalhost
            ? "http://localhost:5001"
            : "http://api.domain.com";
    }
}

这适用于客户端,但由于使用了窗口,我无法在SSR期间在服务器上工作。如何在服务器上执行时获取主机名?

1 个答案:

答案 0 :(得分:2)

你可以做几件事,但最简单的是:

对于在请求之间不能更改的内容,您可以使用NodeJS中的globals对象。因此,在服务器启动时,您可以检测到您是否在localhost上(可能带有CLI标志)并执行global.settings.ApiDomain = <URL>

然后在您的index.js文件中,您可以执行以下操作:

window.settings.ApiDomain = window.location.hostname === 'localhost' ? 
  "http://localhost:5001" : "http://api.domain.com"

然后,无论何时需要使用ApiDomain,您都可以:

const apiDomain = window ? window.settings.ApiDomain : global.settings.ApiDomain