【问题标题】:What does dotenv().ok() do?dotenv().ok() 有什么作用?
【发布时间】:2020-10-14 04:32:06
【问题描述】:

我在 PostgreSQL 中使用 Diesel ORM 包装器。我正在关注the guide on their website,它的代码如下:

pub fn establish_connection() -> PgConnection {
     dotenv().ok();

     let database_url = env::var("DATABASE_URL")
         .expect("DATABASE_URL must be set");
     PgConnection::establish(&database_url)
         .expect(&format!("Error connecting to {}", database_url))
}

我通过 dotenv 文档了解了 dotenv() 的作用——它加载了 env 文件。在源代码中我看到dotenv() 返回一个Result。那么ok() 会做什么呢?它会解开结果吗?如果是这样,为什么不使用unwrap()

【问题讨论】:

  • 参见the docs 了解标准库版本。柴油可能会以此来定义。 ok method 可能也会这样做。 unwrap可以panic,但是ok不行,所以调用者可以处理失败情况
  • @joelb 请注意,ok() 的使用不是为了处理失败情况,而是为了忽略失败情况。在处理失败时,通常不会调用ok()(因为它会丢弃错误信息),而是直接匹配返回的Result

标签: rust rust-result


【解决方案1】:

这是一种忽略由于未能加载 dotenv 环境文件而引起的错误的方法。

dotenv() 返回一个ResultResult::okResult 转换为 Option。这个Option 不会触发关于未使用的Result 的警告。

为什么不使用unwrap()

因为你不希望它失败。在生产环境中,您应该拥有环境文件,而是使用实际的环境变量。如果您unwrapped,那么您的服务将立即在生产中失败。不幸的是,这件事发生在我身上。

【讨论】:

  • 您认为使用ok() 来消除生产代码中的警告是一种好习惯吗?似乎它也会默默地忽略例如文件中的语法错误(在错误结果的LineParse 变体的情况下),或“找不到文件”以外的系统错误(例如,由于权限无效而无法读取文件),您可能想要知道。
  • @user4815162342 in general 不,我认为以这种方式忽略错误并不好。对于dotenv,忽略错误似乎是可以接受的,因为负面结果应该只发生在风险较低的开发中。
  • 我明白你的意思,这个想法是生产中没有问题。我想知道像 Diesel 指南这样广泛使用(和复制/引用)的文件是否应该推广这种模式。也许它至少应该显示错误,就像dotenv().map_err(|e| eprintln!("dotenv: {}", e)).ok() 一样。 (我不确定当文件不存在时是否会打印错误。)如果就更好的习语(如果有的话)达成一致,我可以向他们发送 PR 以更改指南。
  • @user4815162342 我预​​见的一个问题是 Diesel 不想专注于 dotenv,而是专注于 Diesel 特定的代码。延长 dotenv 的错误处理时间会分散该目的。另一种方法是修改 dotenv 以便报告“致命”错误,而可以忽略“警告”错误。这样做的缺点是要求图书馆对什么是/不是致命的有意见。
猜你喜欢
  • 2021-08-02
  • 1970-01-01
  • 2017-05-23
  • 1970-01-01
  • 2023-01-07
  • 2019-12-04
  • 1970-01-01
  • 2018-12-11
  • 1970-01-01
相关资源
最近更新 更多