如何在javascript[客户端]中更改不同阶段的端点?

如何在javascript[客户端]中更改不同阶段的端点?,javascript,go,environment-variables,production-environment,endpoint,Javascript,Go,Environment Variables,Production Environment,Endpoint,我想它可能已经问过了。但根据我的搜索关键字,我找不到任何结果 在我的用例中,我根据阶段信息[桌面、预处理、产品]配置端点。我使用golang作为后端。在后端,我使用APP_STAGE环境变量读取相应的配置。比如说, fileName = APP_STAGE + "-endpoints.cfg" 我在启动服务器之前导出变量 $export APP_STAGE="desktop" desktop-endpoints.cfg将如下所示 { "featured" : { "

我想它可能已经问过了。但根据我的搜索关键字,我找不到任何结果

在我的用例中,我根据阶段信息[桌面、预处理、产品]配置端点。我使用golang作为后端。在后端,我使用APP_STAGE环境变量读取相应的配置。比如说,

fileName =  APP_STAGE + "-endpoints.cfg"
我在启动服务器之前导出变量

$export APP_STAGE="desktop"
desktop-endpoints.cfg将如下所示

{
    "featured" : {
        "httpendpoint": {
            "url": "http://localhost:8081/api/services/featured/"
        }

    },
    "latest" : {
        "httpendpoint": {
            "url": "http://localhost:8081/api/services/latest/"
        }

    }
}
但如何在客户端[javascript]中实现这一点呢?我有以下结构的文件

app/
    view.js
    featured.js
    home.js
每个文件都使用不同的端点进行ajax调用。如何基于javascript中的某个变量[if not env variable]读取阶段配置

有人能帮我吗?我对javascript相当陌生


谢谢。

JavaScript文件由浏览器在客户端执行。浏览器无权访问服务器配置文件,因此服务器有责任读取/获取正确的配置值并使其可供客户端使用。 有多种方法可以解决这个问题。我将概述一些可能的解决办法

1.在HTML文件中包含正确的端点 您可以选择在HTML文件中包含正确的端点,这些文件引用将在其中使用它们的javascript文件

HTML文件将是模板而不是静态文件,您可以使用包来执行这些模板,以包括必要的URL和您需要的所有其他内容,并生成最终的HTML,该HTML将发送到客户端

HTML模板可能包含一个初始化某些JavaScript变量的
标记,然后可以从包含的JavaScript文件中使用该标记

下面是一个简单的示例,它传递了特色的
httpendpoint

HTML模板(
“home.HTML”
):

映射主处理程序,例如:

http.HandleFunc("/index.html", homeHandler)
并确保主页未被缓存,这样浏览器将始终请求一个新的副本,您的服务器可以在其中插入实际的配置值

2.从JavaScript文件执行AJAX请求 您可以选择从JavaScript文件执行AJAX请求,以查询必要的信息。这个问题中有一个简单的例子:

在一个实际示例中,您可以通过一个请求(例如JSON格式)传输客户端需要的所有配置值,这里我只传输一个值

仅获取/发送特色的
httpendpoint

在JavaScript中:

var featuredHttpEndpoint = "";
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
    if (xhr.readyState == 4 && xhr.status == 200) {
        var config = JSON.parse(xhr.responseText);
        featuredHttpEndpoint = config.FeaturedHttpEndpoint;
    }
}
xhr.open("GET", "/config.json", true);
try {
    xhr.send();
} catch (err) {
    // handle error
}
以及提供配置值的Go处理程序:

func configHandler(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json")
    m := map[string]interface{}{
        // Insert the value of endpoint from your config
        "FeaturedHttpEndpoint": "http://localhost:8081/api/services/featured/",
    }
    if err := json.NewEncoder(w).Encode(m); err != nil {
        // Handle error
    }
}
必须映射到客户端调用的路径,例如:

http.HandleFunc("/config.json", configHandler)
3.使用Javascript文件作为模板 您还可以选择将您的Javascript文件制作为模板,并且在为它们提供服务时,您可以使用模板引擎根据您的环境/
APP\u STAGE
包含端点。请参见第1点作为提供模板的示例


如果您要走这条路,您必须注意正确配置Javascript文件的缓存,因为如果js文件的缓存信息表明它们没有过期,浏览器将不会再次要求您提供js文件。

谢谢您的所有建议。我正在努力实现同样的目标。我将在这里更新结果。我实现了选项2。它就像一个符咒。不过我有一个问题。我在home.html中使用config ajax call in script标记,它导入另一个脚本view.js。我在home.html的页脚中导入了view.js。此view.js还进行配置ajax调用。我这样做是因为view.js还有一些其他依赖项。但第一个脚本配置ajax调用不起作用。我的问题是,如果我发出两次配置xhr请求,会不会有问题?我使用了你在选项2中建议的相同代码。@Dany我会找出第一个调用不起作用的原因并解决它。但是除此之外,您可以进行任意多的ajax调用,您可以多次重复相同的ajax调用。至于如何使用从服务器请求的配置:在Javascript中使用
configReceived
变量,如果配置调用成功,该变量应设置为
true
,并且在上述设置为
true
之前不要使用配置变量。好的。非常感谢您的帮助。我正在view.html(来自外部js文件)的头中调用这个配置api。我还在view.html中使用一些使用配置端点的内联js脚本。但不幸的是,内联脚本在配置外部文件调用之前加载。我尝试在while循环中使用configReceived变量执行setTimeOut(),以在收到config之前不加载内联内容。但这会阻塞线程,而while循环永远不会结束。有办法吗?
func configHandler(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json")
    m := map[string]interface{}{
        // Insert the value of endpoint from your config
        "FeaturedHttpEndpoint": "http://localhost:8081/api/services/featured/",
    }
    if err := json.NewEncoder(w).Encode(m); err != nil {
        // Handle error
    }
}
http.HandleFunc("/config.json", configHandler)