配置文件中动态值的替换

220 阅读2分钟

我们的产品需要交付给不同的客户,不同的客户难免有不同的需求,为了兼容不同的需求,我们采用的是配置文件的形式。

比如,客户给我们提供一些 API,我们调用这些 API,然后在我们的产品里显示 API 返回的信息。不同的客户这些 API 基本都不相同,于是我们在配置文件中大概有如下配置:

1.   "someApi": {
2.     "url": "http://xx.xx.xx/code/[params]",
3.     "method": "POST",
4.     "data": {
5.       "condition": {
6.         "where": "date='2023-02-07' and addr='sh'"
7.       }
8.     }

这里 url 后面的 params 是一个动态值,意味着代码里是这样做的:

const params = getParams()
const url = someApi.url + params

同样,第 6 行,2023-02-07sh 也是动态的参数,那么此时该如何拼接上去呢?用字符串相加的办法显然就不太方便了。

这时就可以用模板语法了,如下:

1.   "someApi": {
2.     "url": "http://xx.xx.xx/code/$0",
3.     "method": "POST",
4.     "data": {
5.       "condition": {
6.         "where": "date='$1' and addr='$2'"
7.       }
8.    }

$0 $1 $2作为占位符,代码里可以这样:

1.     function replacePlaceholders(template, params) {
2.       return template
3.         .replace(/\$\d+/g, match => params[Number(match.substring(1))])
4.     }
5.     const template = JSON.stringify(someApi)
6.     const params = [param, date, addr]
7.     let obj = replacePlaceholders(template, params)
8.     obj = JSON.parse(obj)
9.     const url = obj.url
10.    const data = obj.data

第 1 ~ 4 行的replacePlaceholders方法用于替换 $0 $1 $2这些占位符,利用了字符串的 replace 方法,细节这里就不做赘述了,主要是提供了一种替换占位符的思路,感兴趣的读者可以测试下。

第 5 行,先把配置的 JSON 对象转为字符串,第 6 行是参数数组,数组的脚标正好和 $0 $1 $2中的 0 1 2对应,那么第 7 行就是用参数替换占位符后的字符串,第 8 行再转回对象,就能得到可以使用的配置了。

通过这种模板语法,配置文件中的动态值可以很方便的替换,大大简化了配置文件的复杂性,也提高了配置文件的灵活性。