即使在 if (process) 块中使用,也未定义未捕获的进程? [复制]
Posted
技术标签:
【中文标题】即使在 if (process) 块中使用,也未定义未捕获的进程? [复制]【英文标题】:Unacaught process is not defined even when used inside an if (process) block? [duplicate]即使在 if (process) 块中使用,也未定义未捕获的进程? [复制] 【发布时间】:2020-04-12 11:57:08 【问题描述】:所以我试图根据来源在我的 Angular 应用程序中的 API 链接之间交换,但它是一个 s-s-r 应用程序,所以我试图考虑环境变量以及窗口位置,代码如下:
const getApiUrl = (): string =>
if (process && process.env?.AZURE_ENV === 'development')
return 'devlink for s-s-r';
else if (
window &&
window.location.origin === 'devclient'
)
return 'devlink for frontendclient';
else
return 'link.com/';
;
现在抛出的错误是:
Uncaught ReferenceError: process is not defined
我已经深入研究了“已编译”脚本,并 100% 确认它来自这段代码。
这不应该仍然有效吗?
我还尝试了一个只有 if(process) 并得到与上面完全相同的结果的版本。
【问题讨论】:
这能回答你的问题吗? javascript check if variable exists (is defined/initialized) 【参考方案1】:可能它不存在因此无法评估,也许像typeof process !== 'undefined'
那样测试它会有所帮助
如果 process
从未在任何可访问的上下文中定义,我认为它将失败并出现 UncaughtReferenceError,因为它试图访问不在上下文中的内容。未定义意味着变量存在但它没有设置值,这个错误表示变量不存在,这就是为什么检查它的类型可能会解决问题。
【讨论】:
但不应该因为未定义而处理虚假?似乎是一种奇怪的行为;尝试评估未在 if 块中定义的东西通常不是问题,这是让我感到奇怪的部分。我现在就试试“typeof”途径。 如果进程从未在任何可访问的上下文中定义,我认为它会因 UncaughtReferenceError 而失败,因为它正在尝试访问不在上下文中的内容。未定义意味着该变量存在但没有设置值,并且此错误表示该变量不存在,这就是为什么检查它的类型可能会解决问题的原因。我现在无法测试它,因为我在电话中,但试一试 这确实有效,并且学到了一些关于 JS 的新知识,谢谢!【参考方案2】:不。虽然对象的不存在字段实际上是 undefined
,但对不存在变量的读取访问是 JavaScript 中的错误,请使用 typeof
作为其他答案的建议...
console.log("typeof .process",typeof .process);
console.log("typeof process",typeof process);
console.log(".process",.process);
console.log("process",process);
...另外,您的代码是 TypeScript,:string
部分将其泄露。这意味着它被编译为strict mode,甚至对不存在的非局部变量的写访问也会出错。
【讨论】:
【参考方案3】:对于您的情况,如果您不想使用任何其他解决方案,请首先检查 global ,它类似于窗口但在节点上,因此进程将存储在 global.process 中
【讨论】:
【参考方案4】:我对角度不是很熟悉。但通常这应该是客户端代码,它无权访问节点环境变量。就算是s-s-r。
如果您使用 webpack,您可以在客户端将环境变量定义为全局变量:
https://webpack.js.org/plugins/define-plugin/
【讨论】:
这不是问题,因为我不需要它/期望它在那里。我遇到的问题不是评估 if (undefined variable)以上是关于即使在 if (process) 块中使用,也未定义未捕获的进程? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
Alt 通量操作:即使调用 this.generateActions,_this.actions 也未定义
即使 Rails 服务器配置为接受所有请求,Angular 发布请求也未通过预检
即使在 config/initializers/assets.rb 中声明,Sprockets Rails Helper Asset 也未预编译