Node.js中更新后的全局变量未正确传入拼接字符串问题
问题产生原因
模板字符串的插值计算是即时求值的,不存在动态绑定变量引用的特性:
- 服务启动时全局作用域代码最先执行:首先声明
environment变量,此时未手动赋值,变量初始值为undefined - 紧接着执行
myUrl的定义语句,会立刻读取当前environment的值完成字符串拼接,得到固定字符串https://ets-tst-undefined.mydomain.com/health存入myUrl,这一步完成后,myUrl存的就是静态字符串,和后续environment的变量变化没有任何关联 - 路由处理函数是在请求到达时才会触发执行的,此时才给
environment赋值为dev,但myUrl早在服务启动阶段就已经拼接完成,不会自动重新计算,因此打印时变量位置仍然显示undefined
修复方法
不要在全局作用域提前拼接静态URL,根据业务场景选以下任意一种实现即可:
- 按需动态生成:在需要使用URL的位置,等依赖的变量赋值完成后再做模板拼接
const express = require('express'); const axios = require('axios').default; const app = express(); let environment; app.get('/', function (req, res) { environment = 'dev' // 变量赋值完成后再拼接生成URL const myUrl = `https://ets-tst-${environment}.mydomain.com/health` console.log(environment) // 输出: dev console.log(myUrl) // 输出: https://ets-tst-dev.mydomain.com/health res.sendStatus(200) }); app.listen(3000) - 全局变量重赋值:如果需要全局复用
myUrl,在依赖的environment赋值完成后,重新给myUrl赋值即可const express = require('express'); const axios = require('axios').default; const app = express(); let environment; let myUrl; app.get('/', function (req, res) { environment = 'dev' // 赋值完成后更新全局myUrl的值 myUrl = `https://ets-tst-${environment}.mydomain.com/health` console.log(environment) // 输出: dev console.log(myUrl) // 输出正确的请求地址 res.sendStatus(200) }); app.listen(3000)
注:你提供的复现代码缺少
const app = express()和服务监听启动的逻辑,实际运行需要补充这部分才能正常触发路由。
内容的提问来源于stack exchange,提问作者Kaveen M.
相关产品推荐
相关产品推荐

