即使在 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 也未预编译

即使 Azure 推送通知遥测显示“成功”,也未收到 iOS 推送通知